//calendar.js文件
/*
双日历控件 ziqiu.zhang 2007.11.5日 
改版自elong.com 原单日历控件
增加了对XHtml的支持.
 */
document.write('<iframe id=\"CalFrame\" name=\"CalFrame\" frameborder=\"0\" style=\"display:none;position:absolute;z-index:1000\" onload=\"loadCalendarHtm();\"></iframe>');
document.onclick=hideCalendar;//SAC 李志能 增加 2008-12-08 加载Script/calendar/calendar.htm
function loadCalendarHtm() {
}function showCalendar(sImg,bOpenBound,sFld1,sNextP,sNextD,sStartD,sEndD,sVD,sOE,sVDE,sOT,s3F,sFld2,sCallback,sNextVDE,iPosLeft,iPosTop)
{
//1.sImg日历弹出位置的控件的名称,
//2.bOpenBound,
//3.sFld1取得日期的控件名称,


//4.sNextP选取日期后新日历弹出的位置的控件名称,可不输入,
//5.sNextD选取日期后新日历弹出从中取值的控件名称,可不输入,

//6.sStartD开始有效时间,
//7.sEndD截至有效时间,

//8.sVD周几有效,例如:'1,3,5',注意星期日应输入'0'
//9.sOE,单双日有效,'0'表示双日,'1'表示单日
//10.sVDE特殊日期,例如'2004-10-11,2004-11-20,',最后一定要输入','
//11.sOT如果是直接在文本框中点击则值为'text',
//12.s3F下一个日历弹出并选择后点取日期后定位到新的控件

//sFld2,弹出日历默认日期
//sCallback

// sNextVDE 下一次焦点的有效时间.

//iPosLeft 定位x坐标
//iPosTop  定位y坐标

var fld1,fld2;
var cf=document.getElementById("CalFrame");

//SAC 李志能增加,2008-12-08 动态加载calendar.htm,减少页面加载连接
if (cf!=null && cf!="undefine" && cf.src=="") 
{  
    loadCalendarHtm = function() {
         showCalendar(sImg,bOpenBound,sFld1,sNextP,sNextD,sStartD,sEndD,sVD,sOE,sVDE,sOT,s3F,sFld2,sCallback,sNextVDE);          
    }                 
    cf.src = "Script/calendar/calendar.htm";         
    return;     
}

var wcf=window.frames.CalFrame;
var oImg=document.getElementById(sImg);
if(!oImg){alert("控制对象不存在!");return;}
if(!sFld1){alert("输入控件未指定!");return;}
fld1=document.getElementById(sFld1);
if(!fld1){alert("输入控件不存在!");return;}
if(fld1.tagName!="INPUT"||fld1.type!="text"){alert("输入控件类型错误!");return;}
if(sFld2)
{
fld2=document.getElementById(sFld2);
if(!fld2){alert("参考控件不存在!");return;}
if(fld2.tagName!="INPUT"||(fld2.type!="text"&&fld2.type!="hidden")){alert("参考控件类型错误!");return;}
}
if(!wcf.bCalLoaded){alert("日历未成功装载!请刷新页面!");return;}
wcf.n_position=sNextP;
wcf.n_textdate=sNextD;
wcf.startdate=sStartD;
wcf.enddate=sEndD;
wcf.vailidday=sVD;
wcf.oddeven=sOE;
wcf.vailiddate=sVDE;
wcf.nextvailiddate = sNextVDE;
wcf.objecttype=sOT;
wcf.thirdfocus=s3F;
if(cf.style.display=="block"){cf.style.display="none";return;}

/*
//==============新版本更新: 关于日历显示位置的更改 ziqiu.zhang 开始 =================
var eT=0,eL=0,p=oImg;

var sT=(document.body.scrollTop > document.documentElement.scrollTop)? document.body.scrollTop:document.documentElement.scrollTop; var sL=(document.body.scrollLeft > document.documentElement.scrollLeft )? document.body.scrollLeft:document.documentElement.scrollLeft;

var h1 = document.body.clientHeight; var h2 = document.documentElement.clientHeight; var isXhtml = (h2<=h1&&h2!=0)?true:false; var myClient = getClient();

var myScroll = getScroll();

var eH=oImg.height,eW=oImg.width;

while(p&&p.tagName.toUpperCase() !="BODY"){eT+=p.offsetTop;eL+=p.offsetLeft;p=p.offsetParent;}

var bottomSpace = myClient.clientHeight - ( eT - myScroll.sTop ); eH=0;

cf.height = 175;

if(sOT=="text")
{
cf.style.top = ( (bottomSpace>=cf.height)?eT+eH+20:eT-cf.height ).toString() + "px";
}
else
{
cf.style.top = ( (bottomSpace>=cf.height)?eT+eH+20:eT-cf.height ).toString() + "px";
}

cf.style.left=( (isXhtml?document.documentElement.clientWidth:document.body.clientWidth-(eL-sL)>=cf.width)?eL:eL+eW-cf.width ).toString() + "px";
cf.style.display="block";

//==============新版本更新: 关于日历显示位置的更改 ziqiu.zhang 结束 =================
* */


if (!(iPosLeft && iPosTop))
{
//     var pos = getAbsolutePos(oImg);  
//     iPosLeft = pos.x;
//     iPosTop = pos.y + oImg.clientHeight;     var pos = getPositionNew(oImg);
    iPosLeft = pos.OffsetLeft;
    iPosTop = pos.OffsetTop +(oImg.clientHeight == null ? 0 : oImg.clientHeight);
}
cf.style.left = iPosLeft + "px";
cf.style.top  = (iPosTop + 4) + "px";
cf.height = 175;
cf.style.display="block";

wcf.openbound=bOpenBound;
wcf.fld1=fld1;
wcf.fld2=fld2;
wcf.callback=sCallback;
wcf.initCalendar();
}function hideCalendar()
{
var cf=document.getElementById("CalFrame");
cf.style.display="none";
}//获得控件在页面上的绝对位置
function getAbsolutePos(obj)
{
    var pos = { x: 0, y: 0 };
    var offset_x = obj.clientLeft;
    var offset_y = obj.clientTop;
    
    function innerFunction()
    {
        while(obj && (obj.style.position != "relative"))
        {
           pos.x += obj.offsetLeft;
           pos.y += obj.offsetTop;
           pos.x += obj.clientLeft;
           pos.y += obj.clientTop;
           //如果需要计算滚动条
           if(obj.scrollLeft)
             pos.x += obj.clientLeft;
           if(obj.scrollTop)
             pos.y += obj.scrollTop;
             
           obj=obj.offsetParent;
        }
    }
    
    innerFunction();
    pos.x -= offset_x;
    pos.y -= offset_y;
    
    return pos;
}
//ziqiu.zhang 2007.11.5//得到鼠标滚过的距离 scrollTop 与 scrollLeft 
//用法与测试:
/*
var myClient = getClient();
alert("myClient.clientHeight:" + myClient.clientHeight);
alert("myClient.clientWidth:" + myClient.clientWidth);
*/
function getScroll() 
{     
var sTop = 0, sLeft = 0, sWidth = 0, sHeight = 0; 
        
sTop = (document.body.scrollTop > document.documentElement.scrollTop)? document.body.scrollTop:document.documentElement.scrollTop;
if( isNaN(sTop) || sTop <0 ){ sTop = 0 ;}
        
sLeft = (document.body.scrollLeft > document.documentElement.scrollLeft )? document.body.scrollLeft:document.documentElement.scrollLeft;
if( isNaN(sLeft) || sLeft <0 ){ sLeft = 0 ;}

return { sTop:sTop, sLeft: sLeft, sWidth: sWidth, sHeight: sHeight }; 
}//得到浏览器当前显示区域的大小 clientHeight 与 clientWidth
/* 用法与测试:
var myScroll = getScroll();
alert("myScroll.sTop:" + myScroll.sTop);
alert("myScroll.sLeft:" + myScroll.sLeft);
*/
function getClient()
{
     var h1 = document.body.clientHeight;
var h2 = document.documentElement.clientHeight;
var isXhtml = (h2<=h1&&h2!=0)?true:false;

this.clientHeight = isXhtml?document.documentElement.clientHeight:document.body.clientHeight;
this.clientWidth  = isXhtml?document.documentElement.clientWidth:document.body.clientWidth;
            
    return {clientHeight:this.clientHeight,clientWidth:this.clientWidth};
}//获取对象相对于Body对象的偏移量坐标.需要在Body元素加上position:relative, 并且保证任何父级元素都没有position:relative
/*  参数说明:
sObj      : 要弹出图层的事件源
    
用法与测试: 
var sObj = document.getElementById("divId");
var position = ScriptHelperV2.getPosition(sObj);
var sObjOffsetTop = parseInt(  position.OffsetTop );
var sObjOffsetLeft = parseInt( position.OffsetLeft );
*/
function getPositionNew(sObj) {
    var sObjOffsetTop = 0;      //事件源的垂直距离
    var sObjOffsetLeft = 0;     //事件源的水平距离    /* 获取事件源对象的偏移量 */
    var tempObj = sObj; //用于计算事件源坐标的临时对象
    while (tempObj && tempObj.tagName.toUpperCase() != "BODY") {
        sObjOffsetTop += tempObj.offsetTop;
        sObjOffsetLeft += tempObj.offsetLeft;
        tempObj = tempObj.offsetParent;
    }
    tempObj = null;
    return { OffsetTop: sObjOffsetTop, OffsetLeft: sObjOffsetLeft };
}function getClientNew(){
    //判断页面是否符合XHTML标准
    var isXhtml = true;
    if (document.documentElement == null || document.documentElement.clientHeight <= 0) {
        if (document.body.clientHeight > 0) {
            isXhtml = false;
        }
    }    this.clientHeight = isXhtml ? document.documentElement.clientHeight : document.body.clientHeight;
    this.clientWidth = isXhtml ? document.documentElement.clientWidth : document.body.clientWidth;
    return { clientHeight: this.clientHeight, clientWidth: this.clientWidth };
}//  得到鼠标滚过的距离 scrollTop 与 scrollLeft  
/*  用法与测试:
var myScroll = getScroll();
alert("myScroll.scrollTop:" + myScroll.scrollTop);
alert("myScroll.scrollLeft:" + myScroll.scrollLeft);
*/
function getScrollNew() {
    var scrollTop = 0, scrollLeft = 0;    scrollTop = (document.body.scrollTop > document.documentElement.scrollTop) ? document.body.scrollTop : document.documentElement.scrollTop;
    if (isNaN(scrollTop) || scrollTop < 0) { scrollTop = 0; }    scrollLeft = (document.body.scrollLeft > document.documentElement.scrollLeft) ? document.body.scrollLeft : document.documentElement.scrollLeft;
    if (isNaN(scrollLeft) || scrollLeft < 0) { scrollLeft = 0; }    return { scrollTop: scrollTop, scrollLeft: scrollLeft };
}页面调用
<script language="javascript" src='script/calendar/calendar.js'></script>
<label for="check_in" class="hts_lp"> 入住日期:</label><input type="text" class="htd_dt" id="CheckInDate" name="CheckInDate" MAXLENGTH="10" onClick="event.cancelBubble=true;showCalendar('CheckInDate',false,'CheckInDate','CheckOutDate','CheckOutDate','2004-12-01','2016-12-30','','','','text','RoomNum')" value="2009-10-22" />
             
          ---<INPUT class="input_w2 bc1" id=CheckOutDate 
      onclick="javascript:event.cancelBubble=true;showCalendar('CheckOutDate',false,'CheckOutDate','','','','','','','',null,'Price','CheckInDate');" 
      value=2009-10-24 name=CheckOutDate>  --
             <label for="check_out" class="htd_lp">  退房日期:</label><input type="text" class="htd_dt" id="qq" name="qq" MAXLENGTH="10" onClick="event.cancelBubble=true;showCalendar('qq',false,'qq',null,'null','2004-12-01','2016-12-30','','','','text','RoomNum')" value="2009-10-24"/>但是在IE6下面就不能运行了,请高手帮助看看什么问题?

解决方案 »

  1.   

    给楼主介绍1个非常好的,稳定、成熟的JS日期控件,还可以支持时间:http://www.my97.net/dp/index.asp
      

  2.   

    差那个页面calendar.htm这个,但是由于内容太多,我提交不上去了,现在在IE7.IE8,Firefox都可以,就是到了IE6下面就没有反应了
      

  3.   

    http://www.besttrip.cn/date/
    我已经上传到服务器上面,请各位高手下载下来测试一下看看到到底问题在什么地方
      

  4.   

    http://www.besttrip.cn/date/ 
    我已经上传到服务器上面,请各位高手下载下来测试一下看看到到底问题在什么地方