// %Copyright
// ToolsRel: 8.18.09


function SetTempserverDate(date)
{
    TempserverDate = date;
}
function getTempserverDate()
{
    return TempserverDate;
}

function PTImage(src)
{
var temp = new Image();
temp.onerror = function(){loadFailed = true};
temp.src = src;
return temp;
}

var loadedImages = null;
var loadFailed = false;
var saveDateItems = null;
var dtUbound= null;
var dtLbound= null;
var showTime=null;
var TempserverDate=null;

//% Preload images for calendar.
function loadImages(dateitems)
{
var calframe = frames.CalFrame;

if (document.images && calframe)
{
  saveDateItems = dateitems;
  loadedImages = new Array();
  loadedImages[0] = PTImage(dateitems.pt_dateheader);
  loadedImages[1] = PTImage(dateitems.pt_datering);
  loadedImages[2] = PTImage(dateitems.pt_datesel);
  loadedImages[3] = PTImage(dateitems.pt_daystitle);
  loadedImages[4] = PTImage(dateitems.pt_prevmonth);
  loadedImages[5] = PTImage(dateitems.pt_nextmonth);
  
  calframe.calimages = loadedImages;
}
}

function checkImages()
{
return true;
if (loadedImages == null) return false;

if (loadFailed)
{
   if (saveDateItems)
   {
     loadFailed = false;
     loadImages(saveDateItems);
   }
   return false;
}

//% image.complete not set consistently with Netcape 6.x, so don't
//% test if this is Netscape...
if (navigator.appName == "Netscape")
  return true;

for (var i = 0; i < loadedImages.length; ++i)
{
  if (!loadedImages[i].complete)
    return false;
}
return true;
}

function Pair(x, y)
{
this.x = x;
this.y = y;
}


function getPos(fld)
{
if (fld.offsetParent)
{
  var dFTop = 0;
  var dFLeft = 0;
  while (fld && fld.tagName != "BODY")
  {
    dFTop += fld.offsetTop;
    dFLeft += fld.offsetLeft;
    fld = fld.offsetParent;
  }
  return new Pair(dFLeft, dFTop);
}
else
  return new Pair(-1, -1);
}

function getSize(fld)
{
if (fld.offsetWidth)
  return new Pair(fld.offsetWidth, fld.offsetHeight);
else
  return new Pair(0, 0);
}

function getWindowSize()
{
if (document.body.clientWidth)
   return new Pair(document.body.clientWidth, document.body.clientHeight);
else if (window.innerWidth)
   return new Pair(window.innerWidth, window.innerHeight);
else
   return new Pair(200,200);
}

var dateFormat;
var dateFieldToUpdate;
var promptField;
var submitAfter;

var calendarRetry = 0;
var dateBoxOpen = false;

//% retry-able function.  Parameters stored in globals.
function initDate(evt)
{
var fld = document.getElementById(dateFieldToUpdate);
var cal = document.getElementById("CALENDAR");

    if (fld == null || cal == null)
      return;

    if (!checkImages())
    {
      ++calendarRetry;
          if (calendarRetry < 10)
          {
            processing_main0(1);
            setTimeout("initDate();", 1000);
            return;
          }
      processing_main0(0);
      alert("Unable to load images for calendar.");
      calendarRetry = 0;
      return;
    }
    processing_main0(0);

    var string = document.forms[0][dateFieldToUpdate].value;
    var ValDate = document.getElementById(promptField);
    var dt= getDate(string, dateFormat);
     
        if(ValDate.type=='text')
        {
            if(ValDate.value=='')
            {
                dtUbound=-1;
                dtLbound=-1;
                this.showTime=false;
                SetserverDate(getTempserverDate());
                
                if(dt==null)
                    dt=new Date(getserverDate()); 
               
            }
            else
            {
                    dt=new Date(ValDate.value); 
                    SetserverDate(ValDate.value);
            }
        }
        else
        {
            SetserverDate(getTempserverDate());
           if(dt==null)
           {
                if(string==false)
                {
                    dt=new Date(getserverDate()); 
                }
                else
                {
                    dt=new Date(string); 
                }
           }
        }

//%not implemented in IE..  frames.CalFrame.document.styleSheets = document.styleSheets;

//% Find pos of field...

    var pos = getPos(fld);
    var siz = getSize(fld);

    var top = pos.y + siz.y;
    var left = pos.x + siz.x;

    cal.style.display="block";   //% IE 5 on mac will not give correct calsiz without this

    var calsiz = getSize(cal);
    var docsiz = getWindowSize();
    var scrollx = getScrollX();
    var scrolly = getScrollY();

    //% var msg ="fieldpos=(" + pos.x + "," + pos.y + ")\n" +
    //%      "fieldsiz=(" + siz.x + "," + siz.y + ")\n" +
    //%     "calsiz=  (" + calsiz.x + "," + calsiz.y  + ")\n" +
    //%      "docsiz=  (" + docsiz.x + "," + docsiz.y  + ")\n" +
    //%      "scroll=  (" + scrollx + "," + scrolly + ")\n" +
    //%      "initpos= (" + left    + "," + top +")\n";

    if (left + calsiz.x - scrollx > docsiz.x)
      left = docsiz.x - calsiz.x + scrollx;
    if (top + calsiz.y - scrolly > docsiz.y)
      top = docsiz.y - calsiz.y + scrolly;
    if (left < scrollx)
      left = scrollx;
    if (top < scrolly)
      top = scrolly;

    //% msg += "finalpos=(" + left    + "," + top +")";
    //% alert(msg);

    //% IE 5 on mac will not display in correct place unless we
    //% change display around the code that changes the position
    //% (and it still gets it a bit wrong sometimes)
    //% But NS/6 calendar does not work if we DO set display=none... it throws away the
    //% javascript etc in the frame...
    left= evt.clientX + document.body.scrollLeft + 5 ;
    top = evt.clientY + document.body.scrollTop  + 5;
    		
    if  (navigator.appName != "Netscape")
      cal.style.display="none";
    cal.style.top=top;
    cal.style.left=left;
    cal.style.display="block";
    cal.style.visibility="visible";
    
    frames.CalFrame.initCalendar(dt);
    dateBoxOpen = true;
}

function openDate(e,field,format,bsubmit,Ubound,Lbound,showTime,evt)
{
     
        dtUbound= Ubound;
        dtLbound=Lbound;
        this.showTime=showTime;    
    dateFormat = format;
    dateFieldToUpdate = e;
    promptField = field;
    submitAfter=bsubmit;

    if (!dateBoxOpen)
      initDate(evt);
}

function setResult(day, mnt, yr,txtTime)
{

var format = dateFormat.substring(0,3);
var separator = dateFormat.substring(3,4);
if (dateFormat.length>=7)
{
  if (dateFormat.substring(4,5) == "2")
  {
    var yrdef = parseInt(dateFormat.substring(5,7), 10);
    var yr2 = yr%100;
    if (yr2 < yrdef)
    {  //% default 2000
      if (yr2 + 2000 == yr)
        yr = yr2;
    }
    else
    {  //% default 1900
      if (yr2 + 1900 == yr)
        yr = yr2;
    }
  }
}

var formattedDate;
if (format == 'MDY')
  formattedDate = '' + padout(mnt) + separator + padout(day) + separator + padout(yr);
else if (format == 'DMY')
  formattedDate = '' + padout(day) + separator +padout(mnt) + separator  + padout(yr);
else if (format == 'YMD')
  formattedDate = '' + padout(yr) + separator + padout(mnt) + separator + padout(day);

//%alert('Date is = ' + formattedDate);
var obj = document.forms[0][dateFieldToUpdate];
if(showTime==true)
{
    obj.value = formattedDate + ' ' + txtTime;
}
else
{
        obj.value = formattedDate;
}
if(obj.disabled==false)
    obj.focus();
PSclearError_main0(obj);
closeCal();

//obj.form.ICFocus.value = promptField;

if (submitAfter)
  submitAction_main0(obj.form,obj.name);
else
  //% do local edits
  if (typeof obj.onchange != "undefined" && typeof obj.onchange != "unknown"  && obj.onchange)
  {
    obj.onchange();
    PSshowDeferredMsg_main0();
  }
}

function closeCal()
{
closeCal2();
var objFieldToUpdate =document.getElementById(dateFieldToUpdate);
if(objFieldToUpdate.disabled==false)
    objFieldToUpdate.focus();
}

function closeCal2()
{
var cal = document.getElementById("CALENDAR");
cal.style.visibility="hidden";
//% NS/6 calendar does not work if we set display=none... it throws away the
//% javascript etc in the frame...
if  (navigator.appName != "Netscape")
  cal.style.display="none";
dateBoxOpen=false;
}

function padout(number)
{
return (number < 10) ? '0' + number : number;
}






