function cmCarsCalendarInput()
{
    var objectName='cmCarsCalendar';
    var date1Field='depDate';
    var date2Field='destDate';
    var timeField='';
    var timeDiv='';
    var divCal='';
    var dateField='';
    var dateDep='';
    var dateDest='';
    var shift=0;
    var dateNow=null;
    var safariKeyDown=0;
    var mustUseIframe;
    var gCallerObj;
    var browserTest = navigator.appVersion.search(/Safari/);
    var gMonthNames = js_tr['calendar']['months'];
    var gMonthDays = new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
    var singleDay = null;
    var formerDepTime = '12:00';
    var formerDestTime = '09:00';
    this.bindDestOnDep = true;
    this.lastCorrectDepDate = null;
    this.lastCorrectDestDate = null;

    checkBrowserForIframe();
//***********************************************************
function init() {
    dateNow = getToday();
    var depElm = document.getElementById(date1Field);
    var destElm = document.getElementById(date2Field);
    var dep = ( depElm ) ? depElm.value : "";
    var dest = ( destElm ) ? destElm.value : "";
    this.lastCorrectDepDate = parseDate(dep) ? dep : getToday();
    this.lastCorrectDestDate = parseDate(dest) ? dest : getToday();
}
this.init = init;
//***********************************************************
    function checkBrowserForIframe(){
        if(window.clipboardData && document.compatMode){
            if(!window.XMLHttpRequest) {
                mustUseIframe=1;
                return;
            }
        } else if(window.clipboardData){
          if( !document.createDocumentFragment) {
            mustUseIframe=1;
            return;
          }
        }
        mustUseIframe=0;
    }

function getToday(){
    if ( typeof actualServerDate != 'undefined') {
        return actualServerDate;
    } else {
        return getClientToday();
    }
}
this.getToday = getToday;
//***********************************************************
function getClientToday(){
    var todayDate = new Date();
    var thisday=Number(todayDate.getDate());
    var thismonth=Number(todayDate.getMonth())+1;
    var thisyear=Number(todayDate.getYear());
    thisyear = thisyear % 100;
    thisyear = ((thisyear < 50) ? (2000 + thisyear) : (1900 + thisyear));
    if(thisday<10)
        thisday='0'+thisday;
    if(thismonth<10)
        thismonth='0'+thismonth;
    return thisday+'.'+thismonth+'.'+thisyear;
}
this.getClientToday = getClientToday
//***********************************************************
function getTodayDateObject() {
    var today = getToday();
    var dateValues = today.split(".");
    var day = Number(dateValues[0]);
    var month = Number(dateValues[1])-1;
    var year = Number(dateValues[2]);

    var date = new Date(year, month, day);

    return date;
}
this.getTodayDateObject = getTodayDateObject;
//***********************************************************
function showCal(source, div, shift_v){
    getToday();
    shift=shift_v
    divCal=div;
    dateField=source;

   if(!shift) {
     shift=0;
   }
   parseDataField(source);
   var date=null, thisday, thismonth, thisyear;
   if(false!=parseDate(document.getElementById(source).value)){
        var startDate=document.getElementById(source).value;
        thisday=Number(startDate.substr(0,2));
        thismonth=Number(startDate.substr(3,2));
        thisyear=Number(startDate.substr(6,4));
        if(thisyear<100){
            thisyear+=2000;
        }
     date=startDate;
    } else {
        if(dateField==date1Field){//dep
            date = this.lastCorrectDepDate;
        }
        if(dateField==date2Field){//dest
            date = this.lastCorrectDestDate;
        }

        if ( date == null ) {
            date=getToday();
        }

        thisday=Number(date.substr(0,2));
        thismonth=Number(date.substr(3,2));
        thisyear=Number(date.substr(6,4));
    }

    if(dateField==date1Field){//dep
        this.lastCorrectDepDate = date;
        dateDep=date;
    }
    if(dateField==date2Field){//dest
        this.lastCorrectDestDate = date;
        dateDest=date;
    }

  if(shift>0){
    var m_month=thismonth+shift;
    if(m_month/12>1){
      thisyear+=parseInt((m_month-1)/12)
    }
    thismonth=m_month%12;
    if(thismonth==0){
      thismonth=12;
    }
  } else if(shift<0){
    m_month=thismonth+shift; //shift<0!
    if(m_month<0){
      thismonth=m_month%12+12;
    } else{
      thismonth=m_month;
    }
    if(thismonth==0 ){
      thismonth=12;
    }
    if(m_month<=0){
      thisyear-=-parseInt(m_month/12)+1;
    }
  }
  var myDate=getTodayDateObject();
  myDate.setFullYear(thisyear,thismonth-1,1);
  var startspaces=myDate.getDay()-1;
  document.getElementById(divCal).style.visibility='visible';
  if(mustUseIframe){
    if(document.getElementById(div+"_iframe")) {
      document.getElementById(div+"_iframe").style.visibility='visible';
    }
  }
  var content;

  var monthdays = gMonthDays;
  var nDate=getTodayDateObject();
  var nday=nDate.getDate();
  var nmonth=Number(nDate.getMonth())+1;
  var ndate=Number(nDate.getDate());
  var nyear=Number(nDate.getYear());
  nyear = nyear % 100;
  nyear = ((nyear < 50) ? (2000 + nyear) : (1900 + nyear));
  var nowDay;
  if(nyear==thisyear && nmonth==thismonth){
    nowDay=nday;
  } else {
    nowDay=0;
  }
  var leftLink=false;
  if(nyear<thisyear || (nyear==thisyear && nmonth<thismonth) ){
    leftLink=true;
  }
  var rightLink=true;
  var MD = monthdays[thismonth];
  if(thismonth==2){
    if(((thisyear % 4 == 0) && !(thisyear % 100 == 0)) ||(thisyear % 400 == 0)) {
        MD = 29;
    } else {
        MD = 28;
    }
  }


  content="<table cellspacing=2 cellpadding=0 width=100% class='cal' bgcolor='#fef7b3'>\
  <tr><th colspan='7' class='calmonth'>"+ gMonthNames[thismonth] + "&nbsp;" + thisyear+ "</th></tr>\
  <tr style='color:#000000; font-weight:bold;' class='calDays'>"+js_tr['calendar']['days']+"\
  <tr>";
  if(startspaces<0){
    startspaces=6;
  }
  for (var s=0;s<startspaces;s++) {
    content+="<td> </td>";
  }
  var count=1;
  while (count <= MD) {
    for (var b = startspaces;b<7;b++) {
      if (count <= MD) {
        if(count<10){
            count='0'+count;
        }
        var showMonth
        if(thismonth<10){
            showMonth='0'+String(thismonth);
        } else {
          showMonth=thismonth;
        }
        if(count<nowDay){
          content+="<td class='caltdold'>";
          content+=count+"</td>";
        } else {
          /*
          if (count==thisday && shift==0) {
            content+="<td><span class='caltdnow'>";
            content+=count+"</span></td>";
          } else {
            content+='<td onMouseOut="document.getElementById(\''+divCal+'\').innerHTML +=\'\'">';
            content+="<a href='javascript:"+objectName+".setDate(\""+source+"\",\""+divCal+"\", \""+count+"."+showMonth+"."+thisyear+"\")'>";
            content+=count+"</a></td>";
          }
          */
          if (count==thisday && shift==0) {
            content+="<td><span class='caltdnow'>";
            content+=count+"</span></td>";
          } else {
            content+="<td><a href='javascript:"+objectName+".setDate(\""+source+"\",\""+divCal+"\", \""+count+"."+showMonth+"."+thisyear+"\")'>";
            content+=count+"</a></td>";
          }


        }
      } else {
        content+="<td> </td>";
      }
      count++;
    }
    content+="</tr><tr>";
    startspaces=0;
  }
  content+="</table><div id='calCleaner"+divCal+"'></div>";
  if(leftLink){
    var shiftL=shift-1;
    content+="<div class='callinkl' id='callinkl' onclick=\""+objectName+".showCal('"+source+"','"+divCal+"',"+shiftL+")\"></div>";
  }
  if(rightLink){
    var shiftR=shift+1;
    content+="<div class='callinkr' id='callinkr' onclick=\""+objectName+".showCal('"+source+"','"+divCal+"',"+shiftR+")\"></div>";
  }
  try{
    document.getElementById(divCal).innerHTML=content;
  }catch(f){
    log(f)
  }
  if(!shift_v && navigator.appName!='Opera'){
    document.getElementById(source).select();
  }

}
this.showCal=showCal
//***********************************************************
function showTime(input, div){
  timeField=input
  try {
      var tmpTime=document.getElementById(input).value;
  } catch (f) {
    return;
  }

  if (input=='depTime') {
      formerDepTime = tmpTime;
  } else if (input=='destTime'){
      formerDestTime = tmpTime;
  }


  timeDiv=div
  document.getElementById(div).style.visibility='visible'
  if(mustUseIframe){
    document.getElementById(div+'_iframe').style.visibility='visible'
  }

  try{
    document.getElementById(input).select();
  } catch(eee){}

 var  content='<select id="sel'+timeField+'" size=10 onchange="'+objectName+'.rewriteTime(this.id)" onClick="'+objectName+'.rewriteTime(this.id,1)">';
 var activeExist=0;
  for(var h=0; h<24; ++h){
    for(var m=0; m<2; ++m){
      var value='';
      if(h<10){
        value='0';
      }
      value+=h+':'
      if(m==0){
        value+='00';
      } else {
        value+=m*30
      }
      if(value==tmpTime){
        content+="<option  selected=\"selected\" value='"+value+"'>"+value+"</option>";
        activeExist=1;
      } else {
        content+="<option value='"+value+"'>"+value+"</option>";
      }
    }
  }
  content+="</select>";
  document.getElementById(div).innerHTML=content;
  //#hideDivs(0, timeField);
}
this.showTime=showTime;
//***********************************************************
    function rewriteTime(sid, goNext)
    {
        var inputField = sid.substr(3, sid.length);
        var inputObj   = document.getElementById(inputField);
        var selectObj  = document.getElementById(sid);
        inputObj.value = selectObj.value;
        //inputObj.focus();
        markErrorField(inputField+'Error',0);
        if(goNext==1){
            //var call = gCallerObj.name+'.gotoNext("'+inputField+'")';
            //setTimeout(call, 100);
            gCallerObj.gotoNext(inputField);

        }
    }
    this.rewriteTime=rewriteTime
//***********************************************************
    function navigateTime(event)
    {
        id=(event.target) ? event.target.id : event.srcElement.id;
        if(event.keyCode == 40 || event.keyCode == 38){
            if(id=='depTime' || id=='destTime'){
                //for safari skip second event (for onkeydown)
                if(browserTest!=-1){
                    if(safariKeyDown==0){
                        safariKeyDown=1;
                    } else {
                        safariKeyDown=0;
                        return;
                    }
                }
                index=document.getElementById('sel'+id).selectedIndex;
                var newIndex=index;
                if(event.keyCode == 40 && index<48){
                    newIndex=index+1;
                } else if(index>0) {
                    newIndex=index-1;
                }
                document.getElementById('sel'+id).selectedIndex=newIndex;
                var newValue=document.getElementById('sel'+id).value;
                document.getElementById(id).value=newValue;
                if (id=='depTime') {
                    formerDepTime = newValue;
                } else {
                    formerDestTime = newValue;
                }
            }
        }
    }
    this.navigateTime=navigateTime


//***********************************************************
function parseTimeField(id)
{
    var errors = 0;
    var obj = document.getElementById(id);
    var time2parse = obj.value;
    var hour=Number(time2parse.substr(0,2));
    var min=Number(time2parse.substr(3,4));
    if (time2parse.search(/\d{2}[:|,|.]\d{2}$/) == -1) {
        errors = 1;
    } else if((hour<0) || (hour>23) || (min<0) || (min>59)) {
        errors = 1;
    }
    if (singleDay != null) {
        markErrorField(id+'Error', errors)
    }

    if (errors == 0) {
        if (id=='depTime') {
            formerDepTime = obj.value;
        } else if (id=='destTime'){
            formerDestTime = obj.value;
        }
    }
}
this.parseTimeField=parseTimeField

//***********************************************************
function addInterval(date, interval){
    if(!interval)
      interval=7;
    if(!date)
      return dateNow;

     var sday=Number(date.substr(0,2));
     var smonth=Number(date.substr(3,2));
     var syear=Number(date.substr(6,4));

     if(syear<100){
      syear+=2000;
     }
     var monthdays = gMonthDays;//new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
     if (((syear % 4 == 0) && !(syear % 100 == 0)) ||(syear % 400 == 0)){
        monthdays[2]=29;
     } else {
         monthdays[2]=28;
     }

     if((sday+interval)>monthdays[smonth]){
      sday=sday+interval-monthdays[smonth]
      smonth+=1;
      if(smonth==13){
        smonth=1;
        syear+=1;
      }
     } else {
       sday+=interval;
     }
     if(sday<10)
        sday='0'+sday;
     if(smonth<10)
        smonth='0'+smonth;

     var ret=sday+'.'+smonth+'.'+syear;
     return ret;
    }
    this.addInterval = addInterval
//***********************************************************
    function setDate(source,divCal, date)
    {
        if((dateDep=='') || (dateDest=='')){
            dateDep=document.getElementById('depDate').value;
            dateDest=document.getElementById('destDate').value;
        }
        if(source==date1Field){//dep
            dateDep=date;
            dateDest = dateok( dateDep, dateDest ) ? dateDest : date;
            dateDest = this.bindDestOnDep ? addInterval(date, 7) : dateDest;
            document.getElementById(date2Field).value = dateDest;
            document.getElementById(source).value=date;
            markErrorField(source+'Error',0);

        }
        if(source==date2Field){//dest
            dateDest=date;
            document.getElementById(date2Field).value=dateDest;
            markErrorField(date2Field+'Error',0);
        }
        gCallerObj.gotoNext(source);
    }
    this.setDate=setDate;
//***********************************************************
function dateToInt(date) {
    var values = date.split(".");
    var n = values[2] * 10000;
    n += values[1] * 100;
    n += values[0];
    return n;
}

function parseDate(date){
    var tmpDate=String(date);
    if(tmpDate.length>10)
      return false;

    var thisday=Number(date.substr(0,2));
    if(!thisday)
      return false;
    var thismonth=Number(date.substr(3,2));
    if(!thismonth)
      return false;
    var thisyear=Number(date.substr(6,4));
    if(!thisyear)
      return false;
    var monthdays = gMonthDays;//new Array(0,31,28,31,30,31,30,31,31,30,31,30,31);
    if (((thisyear % 4 == 0) && !(thisyear % 100 == 0)) ||(thisyear % 400 == 0)){
      monthdays[2] = 29;
    } else {
      monthdays[2] = 28;
    }

    if(thisday>monthdays[thismonth])
      return false;
    if(thismonth<1 || thismonth>12)
      return false;
    if(thisday<1 || thisday>31)
      return false;
    return true;
}
this.parseDate=parseDate;

//***********************************************************
function parseDataField(field){
    var date=String(document.getElementById(field).value)
    date=date.replace(/,/g,'.');
    date=date.replace(/-/g,'.');
    date=date.replace(/\s/g,'');
    var parsedDate=0;
    var y, m, d;
    if(false==parseDate(date)){//not as 15.10.2007
        if(date.match(/.*\..*/)!=null) { //1.1.09 oder 31.12.9
            var temp = new Array();
            temp = date.split(".");
            d=Number(temp[0]);
            m=Number(temp[1]);
            y=temp[2];
            if (d.toString().length==1){d = "0"+d;}
            if (m.toString().length==1){m = "0"+m;}
            if (y.toString().length==2){y = "20"+y;}
            else if (y.toString().length==1){y = "200"+y;}
            if(false==parseDate(d+'.'+m+'.'+y)){
                parsedDate=0;
            } else {
                parsedDate=d+'.'+m+'.'+y;
            }
        } else if(date.length==8){ //30052007, 30.05.07
            //try 30052007
            d=date.substr(0,2);
            m=date.substr(2,2);
            y=date.substr(4,4);
            if(false==parseDate(d+'.'+m+'.'+y)){//try 30.05.07,30-05-07
                d=date.substr(0,2);
                m=date.substr(3,2);
                y=date.substr(6,2);
                y='20'+y;
                if(false!=parseDate(d+'.'+m+'.'+y))
                    parsedDate=d+'.'+m+'.'+y;
                } else {
                    parsedDate=d+'.'+m+'.'+y;
                }
        } else if(date.length==6) { //300507
            d=date.substr(0,2);
            m=date.substr(2,2);
            y=date.substr(4,2);
            y='20'+y;
            if(false==parseDate(d+'.'+m+'.'+y)){
                parsedDate=0;
            } else {
                parsedDate=d+'.'+m+'.'+y;
            }
        } else if(date.length==10){ //2007-05-30
            y=date.substr(0,4);
            m=date.substr(5,2);
            d=date.substr(8,2);
            if(false!=parseDate(d+'.'+m+'.'+y))
                parsedDate=d+'.'+m+'.'+y;
        } else {
            parsedDate=0;
        }
        if(parsedDate!=0){
            document.getElementById(field).value=parsedDate;
        }
    } else {
        parsedDate=date
    }
    if(parsedDate==0){
        markErrorField(field+'Error',1)
    } else {
        markErrorField(field+'Error',0)
        document.getElementById(field).value=parsedDate;
        if(field==date1Field){
            dateDep=parsedDate;
        } else if(field==date2Field){
            testPeriod();
        }
    }

    checkTimeForSingleDay();


}

this.parseDataField=parseDataField;

    function checkTimeForSingleDay()
    {
        depTimeString = depTime  = document.getElementById('depTime').value;
        destTimeString = destTime = document.getElementById('destTime').value;
        depTime  = depTime.replace(/:/,'');
        destTime = destTime.replace(/:/,'');

        depDate = document.getElementById('depDate').value;
        destDate = document.getElementById('destDate').value;

        if (depDate == destDate) {
            if (parseInt(depTime) >= parseInt(destTime)) {
                formerDepTime = depTimeString;
                formerDestTime = destTimeString;
                document.getElementById('depTime').value='10:00';
                document.getElementById('destTime').value='17:00';
                var depTimeInput = document.getElementById('depTimeInput');
                if (depTimeInput && depTimeInput.style.display != 'block') {
                    markErrorField('depTime',1);
                    markErrorField('destTime',1);
                }
            }
        } else {
            markErrorField('depTime',0);
            markErrorField('destTime',0);
        }
    }
    this.checkTimeForSingleDay=checkTimeForSingleDay;
//***********************************************************
    function testPeriod()
    {
        var dateDep  = document.getElementById(date1Field).value
        var dateDest = document.getElementById(date2Field).value
        //teporary not tested
        //if(!dateok(dateNow, dateDep)){
        //  //
        //} else
        if ( dateNow == null ) {
            dateNow = getToday();
        }
        if(!dateok(dateNow, dateDest)){
          document.getElementById(date2Field).value=dateDest;
        }
    }
//***********************************************************
    function markErrorField(field, status)
    {
        var obj=document.getElementById(field);
        if(status==1){ //error
            var borderW='1px';
            var borderH='1px';
            if(navigator.appName == "Microsoft Internet Explorer"){
                borderW='1px';
            } else if(navigator.appVersion.search(/Safari/)!=-1){
                //borderW='4px';
                //borderH='1px';
                //obj.style.paddingBottom=2;
                //obj.style.paddingTop=2;
                //obj.style.backgroundColor='red'
            }
            obj.style.borderTop='solid red '+borderW;
            obj.style.borderBottom='solid red '+borderW;
            obj.style.borderLeft='solid red '+borderH;
            obj.style.borderRight='solid red '+borderH;
        } else {
            var borderW='1px';
            var borderH='1px';
            if(navigator.appName == "Microsoft Internet Explorer"){
                borderW='1px';
            } else if(navigator.appVersion.search(/Safari/)!=-1){
                //borderW='4px';
                //borderH='1px';
            }
            try {
                //obj.style.borderTop='solid '+borderW;
                //obj.style.borderBottom='solid '+borderW;
                //obj.style.borderLeft='solid '+borderH;
                //obj.style.borderRight='solid '+borderH;
                obj.style.borderColor='#005E34';
                if (field.match(/Error/)) {
                    obj.style.borderTop=borderW;
                    obj.style.borderBottom=borderW;
                    obj.style.borderLeft=borderH;
                    obj.style.borderRight=borderH;
                    //obj.style.backgroundColor='#fff9c5';

                }
            } catch(e) {

            }
        }
    }
    this.markErrorField = markErrorField
//***********************************************************
    function dateok(dateDep, dateDest)
    {
        var depday    = Number( dateDep.substr(0,2));
        var depmonth  = Number( dateDep.substr(3,2));
        var depyear   = Number( dateDep.substr(6,4));
        var destday   = Number(dateDest.substr(0,2));
        var destmonth = Number(dateDest.substr(3,2));
        var destyear  = Number(dateDest.substr(6,4));
        if(destyear<depyear)
            return false;
        if((destyear==depyear) && (destmonth<depmonth))
            return false;
        if((destyear==depyear) && (destmonth==depmonth) && (destday<depday))
            return false;
        return true;
    }
//***********************************************************
    function setCaller(obj)
    {
        gCallerObj = obj;
    }
    this.setCaller = setCaller
//***********************************************************
  function log(msg)
  {
    try {
        console.log(msg);
    } catch(e) {
        try {
            document.getElementById('logs').innerHTML+=msg+'<br/>';
        } catch(f) {
            //
        }
    }
  }//F:log
//***********************************************************
}
var cmCarsCalendar = new cmCarsCalendarInput();
window.onDomReady( function() {
    cmCarsCalendar.init();
});
