/********************************/
//    Dynamic Dependant Project
//    GUI Stuff
//    Requires the foundation code
/********************************/


var ddp;
if(!ddp) ddp = {};
ddp.gui = {};

/********************************/
//    DDP -> GUI
/********************************/


(function() {

var scriptPath = (ddp.c && ddp.c.scriptPath) ? ddp.c.scriptPath : '';
ddp.f.addLinkStyleSheet(scriptPath + 'ddp.gui.css');
var directoryLocation = scriptPath;


/*Infobox Display Types - makes for quick settings
 * type: 1,* grey out background, centered box on screen, off box click to hide, sizes to content (*this is the default type)
 * type: 2, grey out background, not centered
 * type: 3, no grey out, centered
 * type: 4, no grey out, not centered
 * 
 */
function infobox()
{
	this.ibthis = this;
	this.type=1;
	this.posx=0;
	this.posy=0;
	this.width=null;
	this.height=null;
	this.cssstyle='ddpinfoboxdark';
	this.greyout = true; //grey out the background
	this.center = true; //center the box on the screen
	this.showinscreen = true; //force the box to be inside the visible window
	this.grouping = true; //groups images with the same "rel" tags for next previous abillity
	this.caption = true; //display a caption at the bottom
	this.groupbuttons = true; //display next and previous buttons for grouped images
	this.disablegreyoutclick = false; //if true, don't close the popup by clicking the the grey area
	this.closebutton = true;
	
	this.csu = 0;
	
	this.ws = ddp.f.getBrowserGeometry();
	
	this.browserdt = new ddp.f.BrowserDetect();
	
}

infobox.prototype = {
	
	setArguments: function(options)
	{
		if(typeof options == "undefined") options = {};
		
		var default_args = {
		'type': 1,
		'posx': 0,
		'posy': 0,
		'width': null,
		'height':null,
		'cssstyle':'ddpinfoboxdark',
		'greyout':true,
		'center':false, 
		'showinscreen':true,
		'grouping':true,
		'caption':true,
		'groupbuttons':true,
		'disablegreyoutclick':false,
		'closebutton':true
		}

		for(var index in default_args) {
			if(typeof options[index] == "undefined") options[index] = default_args[index];
		}

		this.type = options['type'];
		this.posx = options['posx'];
		this.posy = options['posy'];
		this.width = options['width'];
		this.height = options['height'];
		this.cssstyle = options['cssstyle'];
		this.greyout = options['greyout'];
		this.center = options['center'];
		this.showinscreen = options['showinscreen'];
		this.grouping = options['grouping'];
		this.caption = options['caption'];
		this.groupbuttons = options['groupbuttons'];
		this.disablegreyoutclick = options['disablegreyoutclick'];
		this.closebutton = options['closebutton'];
		
	},
	
    displayContent: function(content,options)
    {
		this.setArguments(options);
        content = (typeof content == "undefined")?' ':content
        this.show(content,null);
    },
    
	displaySrc: function(src,options)
    {       
		this.setArguments(options);
		var pagesrc = (typeof src == "undefined")?' ':src;
        this.show("",pagesrc);
    },
	
	displayImg : function(imgobj)//takes object: <a href="img.jpg"></a>
	{
		var controls = "";
		
		imgPreload = new Image();
		imgPreload.src = imgobj.href;
		imgPreload.alt = imgobj.getAttribute('title');
		
		var objContainer = document.createElement("div");
		
		var objFooter = document.createElement("div");
		ddp.f.setClass(objFooter ,'footer');
		objFooter.style.width = (imgPreload.width - 60) + "px";
		
		if(this.caption)
		{
			if(imgPreload.alt)
			controls += "<span>"+imgPreload.alt+"</span>";
			if (this.grouping)
				controls += "<BR>";
		}

		if (this.grouping) {
			controls += "<span style=\"color: rgb(204, 204, 204);\">Image "+ (parseInt(imgobj.cur)+1) +" of "+ (parseInt(imgobj.total)+1) +"</span> ";
			
			var nn = null;
			var prv = null;
			
			if (imgobj.cur > 0) {
				
				nn = parseInt(imgobj.cur) - 1;
				prv = imgobj.rel + nn;
				if (!this.groupbuttons) {
					controls += "<span class=\"np\" onclick=\"ddp.f.$('" + prv + "').onclick()\">< Previous</span>";
					if (imgobj.cur < imgobj.total) 
						controls += " | ";
				}
			}
			if (imgobj.cur < imgobj.total) {
				
				nn = parseInt(imgobj.cur) + 1;
				nxt = imgobj.rel + nn;
				if(!this.groupbuttons)
					controls += "<span class=\"np\" onclick=\"ddp.f.$('" + nxt + "').onclick()\">Next ></span>";	
			}
			
			objFooter.innerHTML = controls;
			
			if(this.groupbuttons)
			{			
					var prevBtn = document.createElement('span');
					prevBtn.setAttribute('id', 'InfoboxPrevBtn');
					prevBtn.style.position = 'absolute';
					prevBtn.style.cursor = 'pointer';
					prevBtn.style.right = '30px';
					prevBtn.style.bottom = '10px';

					if (this.browserdt.browser == 'Explorer' && this.browserdt.version < 8) 
						prevBtn.innerHTML = "<img src=\"" + directoryLocation + "prevbtn.gif\">";
					else 
						prevBtn.innerHTML = "<img src=\"" + directoryLocation + "prevbtn.png\">";
						
					var nextBtn = document.createElement('span');
					nextBtn.setAttribute('id', 'InfoboxNextBtn');
					nextBtn.style.position = 'absolute';
					nextBtn.style.right = '10px';
					nextBtn.style.bottom = '10px';
					nextBtn.style.cursor = 'pointer';
					nextBtn
					if (this.browserdt.browser == 'Explorer' && this.browserdt.version < 8) 
						nextBtn.innerHTML = "<img src=\"" + directoryLocation + "nxtbtn.gif\">";
					else 
						nextBtn.innerHTML = "<img src=\"" + directoryLocation + "nxtbtn.png\">";
			
				if (imgobj.cur < imgobj.total)
					nextBtn.onclick = function(){ddp.f.$(nxt).onclick()};
				else
				{
					nextBtn.style.cursor = null;
					nextBtn.onclick = null;
					nextBtn.style.filter = 'alpha(opacity=20)';
					nextBtn.style.opacity = '.20';
				}
				
				if (imgobj.cur > 0) 
					prevBtn.onclick = function(){ddp.f.$(prv).onclick()};
				else
				{
					prevBtn.style.cursor = null;
					prevBtn.onclick = null;
					prevBtn.style.filter = 'alpha(opacity=20)';
					prevBtn.style.opacity = '.20';
				}
				
				objFooter.appendChild(nextBtn);
				objFooter.appendChild(prevBtn);
				
			}
			else
			{
			
			}
		}
		
		
		
		objContainer.appendChild(imgPreload);
		
		objContainer.appendChild(objFooter);
		
		
		
		var ibthis = this;
		
		if (imgPreload.complete) {
			ibthis.show(objContainer, null);
		}
		else 
			imgPreload.onload = function(){
				ibthis.show(objContainer, null);
			}
	
	},
	
	displayIframe : function(src,options)
	{
		this.setArguments(options);	
	
		var iframeContainer = document.createElement("iframe");
		iframeContainer.setAttribute('id', 'ddpinfoboxiframe');
		ddp.f.setClass(iframeContainer,'ddpinfoboxiframe'); 
		iframeContainer.src = src;
		iframeContainer.style.width = "100%";
		iframeContainer.style.height = this.height + "px";
		this.show(iframeContainer,null);		
	},
	
	
    show: function(content,src)
    {    

		
		this.csu = 0;
	
        var maxZindex = ddp.f.returnMaxZindex();
        maxZindex++;
        
        var objInfobox = ddp.f.$('ddpinfobox');
        var objInfoboxContent = ddp.f.$('ddpinfoboxcontent');
		
		//there might be a timer used to position center the box, remove it.
		if(objInfobox.timer)clearTimeout(objInfobox.timer);

		if (this.width != null)
			objInfobox.style.width = this.width + "px";
		else
			objInfobox.style.width = null;			
		if(this.height)
			objInfobox.style.height = this.height + "px";		
		else
			objInfobox.style.height = null;
		
		objInfoboxContent.innerHTML = "Loading...";
        
        objInfobox.style.zIndex = maxZindex;
        
		if (content.constructor == String) {
		
			if (src == null) 
				objInfoboxContent.innerHTML = content;
			else {
				ddp.a.HTTPRequest('get', src, null, function(data){
					objInfoboxContent.innerHTML = data;
				}, null, 'text');
				
			}
		}
		else
		{
			objInfoboxContent.innerHTML = "";
			objInfoboxContent.appendChild(content);
		}
		switch(this.type)
		{
			case 1:
				this.greyout = true;
				this.center = true;
			break;
			case 2:
				this.greyout = true;
				this.center = false;
			break;
			case 3:
				this.greyout = false;
				this.center = true;
			break;
			case 4:
				this.greyout = false;
				this.center = false;
			break;
		}
		
		if (this.greyout) {
			var objOverlay = ddp.f.$('ddpoverlay');
			// set height of Overlay to take up whole page
			if (this.ws.documentHeight < this.ws.viewportHeight) 
				objOverlay.style.height = (this.ws.viewportHeight + 'px');
			else 
				objOverlay.style.height = (this.ws.documentHeight + 'px');
			
			objOverlay.style.width = (this.ws.viewportWidth + 'px');
			objOverlay.style.display = 'block';
			
			
            
            if (this.disablegreyoutclick == false) {
            
                objOverlay.onclick = function(){
                    objInfobox.style.display = 'none';
                    objOverlay.style.display = 'none';
                    return false;
                    
                }
            }
			else {
				objOverlay.onclick = null;
			}
			
		}
		
		 if (this.closebutton) {
            var closeBtn = document.createElement('span');
            closeBtn.setAttribute('id', 'InfoboxCloseBtn');
            if (this.greyout) {
            
            
                closeBtn.onclick = function(){
					  if(ddp.f.$('ddpinfoboxcontent'))
					   	ddp.f.$('ddpinfoboxcontent').innerHTML = "";
					  if(ddp.f.$('ddpinfoboxiframe'))
					   	ddp.f.$('ddpinfoboxiframe').src = "";
                    objInfobox.style.display = 'none';
                    objOverlay.style.display = 'none';
                    return false;
                }
                
                
            }
            else {
            
                closeBtn.onclick = function(){
					 if(ddp.f.$('ddpinfoboxcontent'))
					   	ddp.f.$('ddpinfoboxcontent').innerHTML = "";
					  if(ddp.f.$('ddpinfoboxiframe'))
					   	ddp.f.$('ddpinfoboxiframe').src = "";
                    objInfobox.style.display = 'none';
                    return false;
                }
                
            }
            closeBtn.style.cursor = 'pointer';
            closeBtn.style.right = '-13px';
            closeBtn.style.top = '-13px';
            closeBtn.style.position = 'absolute';
            
            if (this.browserdt.browser == 'Explorer' && this.browserdt.version < 8) 
                closeBtn.innerHTML = "<img style=\"position:relative;\" src=\"" + directoryLocation + "closebtnrnd.gif\">";
            else 
                closeBtn.innerHTML = "<img style=\"position:relative;\" src=\"" + directoryLocation + "closebtnrnd.png\">";
            
            
			ddp.f.$('ddpinfoboxclsholder').appendChild(closeBtn);
        }
		
		
		
		
		objInfobox.style.display = 'block';

		
		
		if(this.center)
		{			
			this.checkSizeUpdate(objInfobox);
			this.positionCenter(objInfobox);
		}
		else
		{
			this.positionWindow(objInfobox);		
		}
  
    }, 
	
	close : function()
	{
		 if(ddp.f.$('ddpinfoboxcontent'))
			ddp.f.$('ddpinfoboxcontent').innerHTML = "";
		if(ddp.f.$('ddpinfoboxiframe'))
			ddp.f.$('ddpinfoboxiframe').src = "";
		
       var objInfobox = ddp.f.$('ddpinfobox');
		
		if (this.greyout) {
        
            objInfobox.style.display = 'none';
            ddp.f.$('ddpoverlay').style.display = 'none';
            return false;
            
        }
        else {
        
            objInfobox.style.display = 'none';
            return false;
        }
	},
	
	checkSizeUpdate : function(ibobj)
	{		
		var ibthis = this;
		if(ibobj.timer)clearInterval(ibobj.timer);
		 var ibl=ibobj.style.left;
		 ibobj.timer=setInterval(function(){		 	
			if(ibobj.style.left != ibl)
			{
				ibthis.positionCenter(ibobj);				
			}
			ibthis.csu++;
			if(ibthis.csu > 50) clearTimeout(ibobj.timer);
		},100)
	},
	
	positionCenter : function(obj)
	{
		this.ws = ddp.f.getBrowserGeometry(); //update the position information
		var ibTop = this.ws.verticalScroll + ((this.ws.viewportHeight - obj.offsetHeight) / 2);
		var ibLeft = ((this.ws.viewportWidth  - obj.offsetWidth) / 2);
		obj.style.top = (ibTop < 0) ? "0px" : ibTop + "px";
		obj.style.left = (ibLeft < 0) ? "0px" : ibLeft + "px";
	},
	
positionWindow : function(obj)
	{
		if (this.showinscreen) {
			this.ws = ddp.f.getBrowserGeometry(); //update the position information
			//check to make sure its not going to display outside the current view area		
			var objbottom = this.posy + obj.offsetHeight;
			var objright = this.posx + obj.offsetWidth;
			if (objbottom > (this.ws.viewportHeight + this.ws.verticalScroll)) 
				this.posy = (this.ws.viewportHeight + this.ws.verticalScroll) - obj.offsetHeight;
			if (objright > this.ws.viewportWidth)
				this.posx = this.ws.viewportWidth - obj.offsetWidth - 15;				
			obj.style.top = this.posy +"px";
			obj.style.left = this.posx +"px";
		}
		else
		{
			obj.style.top = this.posy +"px";
			obj.style.left = this.posx +"px";
		}
		
	},
    
    create : function(options)
    {    
		this.setArguments(options);
		
        var objBody = document.getElementsByTagName("body").item(0);
        
        var objInfobox = document.createElement("div");
        
     
        objInfobox.setAttribute('id', 'ddpinfobox');
		ddp.f.setClass(objInfobox,this.cssstyle); 
         

        var clsholder = document.createElement('div');
		clsholder.id = "ddpinfoboxclsholder";
		
        objInfobox.appendChild(clsholder);
	
        var objInfoboxContent = document.createElement("div");
		ddp.f.setClass(objInfoboxContent,'inside');
        
        objInfoboxContent.id = "ddpinfoboxcontent";
        
		clsholder.appendChild(objInfoboxContent);

        objBody.insertBefore(objInfobox, objBody.firstChild);
		
		//insert the grey background if requried - show is the default setting
		if(this.greyout)
		{
			var objBody = document.getElementsByTagName("body").item(0);
		
			var objOverlay = document.createElement("div");
			objOverlay.setAttribute('id', 'ddpoverlay');
			objOverlay.style.display = 'none';
			objOverlay.style.position = 'absolute';
			objOverlay.style.top = '0';
			objOverlay.style.left = '0';
			objOverlay.style.zIndex = '90';
			objOverlay.style.width = '100';
			objOverlay.style.backgroundColor = '#000';
			objOverlay.style.filter = 'alpha(opacity=75)';
			objOverlay.style.opacity = '.75';
			objBody.insertBefore(objOverlay, objBody.firstChild);
		}	
    },
	
	//Make links that have attribute of <rel = "???"> open into the infobox
	// <a href="http://www.linktophotos.com/photo.jpg" rel="myreltag">Thumbnail or similar</a>
	// var ib = new ddp.gui.infobox;
	// ib.create(); //can take optional arguments array such as "{grouping:false}"
	// ib.attachToPhotos('myreltag');
	attachToPhotos : function(rel)
	{
		ibObj = this.ibthis;
		if (!document.getElementsByTagName){ return; }
		var anchors = document.getElementsByTagName("a");
		var myrel = rel;
		var idrel;
		var ii=0;
		var total = 0;
		//get a total
		for (var zi=0; zi<anchors.length; zi++)
		{
			var anchor = anchors[zi];
			if(anchor.getAttribute("href") && (anchor.getAttribute("rel") == rel))
				{total++;}
		}
		// loop through all anchor tags
		for (var i=0; i<anchors.length; i++)
		{
			
			var anchor = anchors[i];			
			
			
			if (anchor.getAttribute("href") && (anchor.getAttribute("rel") == rel))
			{	
				
				//myrel = rel;
				idrel = rel + ii;
				
				anchor.setAttribute('id',idrel);
				anchor.cur = ii;
				
				anchor.rel = myrel;
				anchor.onclick = function () {ibObj.displayImg(this); return false;}
				ii++;
				anchor.total = total -1;
			}
		}

	}

}





/**************************************************/
//addDateFieldButtons
//
function addDateFieldButtons(nameOfClassOrArray, elParent, objCalendarControl){
  objCalendarControl = objCalendarControl || new CalendarControl();
	var dateFields = !ddp.f.isString(nameOfClassOrArray) ? nameOfClassOrArray : ddp.f.getElementsByClassName(nameOfClassOrArray, elParent);
  if(dateFields==null)
    return false;
	for(var i=0, l=dateFields.length; i<l; i++){
    if(!dateFields[i].ddpCalendarButton){
  		//dateFields[i].title = '(default date format dd-mmm-yyyy)';
  		//ddp.f.addEvent(dateFields[i], 'keypress', function(e){return ddp.f.inputFilter('date', e);});
      //ddp.f.addEvent(dateFields[i], 'blur', function(e){validateAndReformat(getEventTarget(e));});
  		
  		var elCalendarButton = document.createElement('INPUT');
  		elCalendarButton.title = 'Choose the date from a calendar';
  		elCalendarButton.type = 'button';
  		elCalendarButton.className = 'calendarButton';
      elCalendarButton.ddpAssociatedField = dateFields[i]; //record a reference to the button's date field
      
  		ddp.f.addEvent(elCalendarButton, 'click', function(){ objCalendarControl.show(this.ddpAssociatedField); });
      ddp.f.addEvent(elCalendarButton, 'mouseover', function(){ this.style.backgroundColor = '#ffffff'; });
      ddp.f.addEvent(elCalendarButton, 'mouseout', function(){ this.style.backgroundColor = ''; });
  		ddp.f.insertElementAfter(elCalendarButton, dateFields[i]);
      dateFields[i].ddpCalendarButton = elCalendarButton;
    }
	}
}

//
function CalendarControl(){
  //declare vars for the scope of this control
  var currentYear, currentMonth, currentDay;
  var selectedYear = 0, selectedMonth = 0, selectedDay = 0;
  var objWindow = null;
  var elElement = null;
  var elFirstCalendarElement;
  var objThisControl = this;
  
  //creat the container element
  var elContainer = document.createElement('div');
  elContainer.style.display = 'none';
  elContainer.style.width = '200px';
  elContainer.style.height = '200px';
  //elContainer.style.border = 'solid 1px #000000';
  elContainer.className = 'ddpCalendarControl';
  elContainer.appendChild(document.createElement('div')); //temp element so we can replace it

  
  ddp.f.addEvent(document, 'click', function(objEvent){
    if(elContainer.style.display != 'none' && objThisControl.closeable){
      if(!ddp.f.isChild(ddp.f.getEventTarget(objEvent), elContainer))
        hide();
    }
  });
  
  var elFrame = null;
  var objBD = new ddp.f.BrowserDetect();
  if(objBD.browser=='Explorer' && objBD.version < 7){
    elFrame = document.createElement('iframe');
    elFrame.className = 'ddpCalendarControlIFrame';
    elFrame.style.position = 'absolute';
    elFrame.style.display = 'none';
    elFrame.style.zIndex = '300';
    elFrame.src = 'javascript: false';
    elFrame.frameBorder = '0';
    elFrame.frameSpacing= '0';
    elFrame.marginHeight= '0';
    elFrame.marginWidth= '0';
  }
  

  function getParentZIndex(el){
    var lookForZIndex = function(){
      if(this.nodeType==9)
        return null;
      var z = ddp.f.getEffectiveStyle(this, 'z-index');
      if(isFinite(z) && z!= 0)
        return Number(z);
    };
    return ddp.f.climbDOMTree(el, lookForZIndex, null, false);
  }
  
  this.customCSS = function(strURL, strContainerClassName){
    if(ddp.f.isString(strContainerClassName))
      elContainer.className = strContainerClassName;
    return ddp.f.addLinkStyleSheet(strURL, null, false);
  };
  
  function windowHide(objEvent){
    //don't let scroll events that bubbled up from children hide the control (Oprah does it)
    if(objEvent.type=='scroll' && this != ddp.f.getEventTarget(objEvent))
      return;
    hide();
    removeHandlers();
  }
  
  //position the calendar  
  function positionContainer(){
    //returns an object with x and y properties
    var objPosition = ddp.f.getElementPosition(elElement, null, true);
    if(objWindow){
      objPosition.y -= objWindow.y
      objPosition.x -= objWindow.x
    }
    elContainer.style.top = (objPosition.y + ddp.f.getElementHeight(elElement)) + 'px';
    elContainer.style.left = objPosition.x + 'px';
    if(elFrame){
      elFrame.style.top = elContainer.style.top;
      elFrame.style.left = elContainer.style.left;
      elFrame.style.width = elContainer.style.width;
      elFrame.style.height = elContainer.style.height;
    }
  }
  
  function removeHandlers(){
    if(objWindow){
      //remove all the event handlers
      ddp.f.removeEvent(objWindow, 'minimize', windowHide)
      ddp.f.removeEvent(objWindow, 'hide', windowHide)
      ddp.f.removeEvent(objWindow, 'blur', windowHide);
      ddp.f.removeEvent(objWindow, 'resize', windowHide);
      //ddp.f.removeEvent(objWindow, 'resize', positionContainer);
      ddp.f.removeEvent(objWindow.elements.body, 'scroll', windowHide);
      objWindow = null;
    }
  }
  
  this.show=function(el, zIndex){
    //set the elElement (which is accessible within the whole scope of this control)
    elElement = el;
    removeHandlers();
    
    var dtTmp = new Date();
    currentYear = dtTmp.getFullYear();
    currentMonth = dtTmp.getMonth() + 1;
    currentDay = dtTmp.getDate();
    
    if(ddp.w)
      objWindow = ddp.w.getWindowByElement(elElement);

    if(objWindow){
      ddp.f.addEvent(objWindow, 'minimize', windowHide)
      ddp.f.addEvent(objWindow, 'hide', windowHide);
      ddp.f.addEvent(objWindow, 'blur', windowHide);
      ddp.f.addEvent(objWindow, 'resize', windowHide);
      //ddp.f.addEvent(objWindow, 'resize', positionContainer);
      ddp.f.addEvent(objWindow.elements.body, 'scroll', windowHide);
      
      zIndex = Number(objWindow.elements.container.style.zIndex);
      if(elContainer.parentNode != objWindow.elements.body){
        var elBody = objWindow.elements.body;
        if(elFrame){
          if(elFrame.parentNode)
            elFrame.parentNode.removeChild(elFrame);
          elBody.appendChild(elFrame);
        }
        if(elContainer.parentNode)
          elContainer.parentNode.removeChild(elContainer);
        elBody.appendChild(elContainer);
      }
    }
    else{
      var z = getParentZIndex(elElement);
      if(z!=null)
        zIndex = z;
      if(elContainer.parentNode != document.getElementsByTagName('body')[0]){
        var elBody = document.getElementsByTagName('body')[0];
        if(elFrame){
          if(elFrame.parentNode)
            elFrame.parentNode.removeChild(elFrame);
          elBody.appendChild(elFrame);
        }
        if(elContainer.parentNode)
          elContainer.parentNode.removeChild(elContainer);
        elBody.appendChild(elContainer);
      }
    }
    
    var dtSelected = null;
    
    if(isFinite(zIndex)){
      if(elFrame)
        elFrame.style.zIndex = zIndex;
      elContainer.style.zIndex = zIndex;
    }
    else{
      if(elFrame)
        elFrame.style.zIndex = '300';
      elContainer.style.zIndex = '300';
    }
    
    if(elElement && elElement.value)
      dtSelected = ddp.f.parseDateString(elElement.value);
    
    if(dtSelected){
      selectedYear = dtSelected.getFullYear();
      selectedMonth = dtSelected.getMonth() + 1;
      selectedDay = dtSelected.getDate();
      createTable(selectedYear, selectedMonth, elElement);
    }
    else
      createTable(currentYear, currentMonth, elElement);

    positionContainer(elElement);
    elContainer.style.display = 'block';
    if(elFirstCalendarElement && elFirstCalendarElement.focus){
      elFirstCalendarElement.focus();
    }
    if(elFrame)
      elFrame.style.display = 'block';
    objThisControl.closeableTimeout = window.setTimeout(function(){ objThisControl.closeable = true; objThisControl.closeableTimeout= null; }, 100);
  };
  
  function hide(){
    selectedYear = 0;
    selectedMonth = 0;
    selectedDay = 0;
    if(elFrame)
      elFrame.style.display = 'none';
    elContainer.style.display = 'none';
    objThisControl.closeable = false;
    if(objThisControl.closeableTimeout)
      window.clearTimeout(objThisControl.closeableTimeout)
    removeHandlers();
  }
  this.hide=hide;
  
  function getDaysInMonth(month, year){
    if(!year)
      year = (new Date()).getFullYear();
    return [31,((!(year % 4 ) && ( (year % 100 ) || !( year % 400 ) ))?29:28),31,30,31,30,31,31,30,31,30,31][month-1];
  }

  function createTable(displayYear, displayMonth, elElement){
    var formatType = 1;
    var strLang = 'en';
    
    displayYear = parseInt(displayYear);
    displayMonth = parseInt(displayMonth);
    
    if(displayMonth>12){
      displayMonth = 1;
      displayYear++;
    }
    if(displayMonth<1){
      displayMonth = 12;
      displayYear--;
    }
    
    if(elElement.lang && elElement.lang.length)
      strLang = elElement.lang.toLowerCase();
    
    if(elElement && elElement.ddpCalendarDateFormat){
      if(isFinite(elElement.ddpCalendarDateFormat))
        formatType = elElement.ddpCalendarDateFormat;
    }
    
    var dtTmp = new Date(displayYear, displayMonth-1, 1)
    var startDayOfWeek = dtTmp.getDay();
    var daysInMonth = getDaysInMonth(displayMonth, displayYear);
    var elNewTable = document.createElement('table');
    var elTableBody = document.createElement('tbody');
    elNewTable.cellSpacing='0';
    elNewTable.cellPadding='0';
    elNewTable.border='0';
    //elNewTable.style.borderSpacing = '0';
    
    var elTR = document.createElement('tr');
    elTR.className = 'header';

    var elTD = document.createElement('td');
    if(strLang=='en')
      elTD.title='Previous Year';
    elTD.className = 'selectionButton';
    var elA = elFirstCalendarElement = document.createElement('a');
    elA.setAttribute('href', 'javascript: void(0);');
    ddp.f.addEvent(elA, 'click', function(objEvent){ ddp.f.preventEventDefault(objEvent); });
    elA.appendChild(document.createTextNode('<'));
    elTD.appendChild(elA);
    ddp.f.addEvent(elTD, 'click', function(objEvent){ ddp.f.cancelEvent(objEvent); createTable(displayYear-1, displayMonth, elElement); });
    ddp.f.addEvent(elTD, 'mouseover', function(){ddp.f.addClass(this, 'selectionButtonHover');});
    ddp.f.addEvent(elTD, 'mouseout', function(){ddp.f.removeClass(this, 'selectionButtonHover');});
    elTR.appendChild(elTD);

    var elTD = document.createElement('td');
    elTD.setAttribute('colSpan', '5');
    var elSelect = document.createElement('select');
    for(var y=displayYear+10; y>=displayYear-10; y--){
      elSelect.options[elSelect.options.length] = new Option(y, y);
    }
    elSelect.value = displayYear;

    ddp.f.addEvent(elSelect, 'change', function(){ createTable(this.value, displayMonth, elElement); });
    elTD.appendChild(elSelect);
    elTR.appendChild(elTD);

    var elTD = document.createElement('td');
    if(strLang=='en')
      elTD.title='Next Year';
    elTD.className = 'selectionButton';
    var elA = document.createElement('a');
    elA.setAttribute('href', 'javascript: void(0);');
    ddp.f.addEvent(elA, 'click', function(objEvent){ ddp.f.preventEventDefault(objEvent); });
    elA.appendChild(document.createTextNode('>'));
    elTD.appendChild(elA);
    ddp.f.addEvent(elTD, 'click', function(objEvent){ ddp.f.cancelEvent(objEvent); createTable(displayYear+1, displayMonth, elElement); });
    ddp.f.addEvent(elTD, 'mouseover', function(){ddp.f.addClass(this, 'selectionButtonHover');});
    ddp.f.addEvent(elTD, 'mouseout', function(){ddp.f.removeClass(this, 'selectionButtonHover');});
    elTR.appendChild(elTD);
    
    elTableBody.appendChild(elTR);
   
    var elTR = document.createElement('tr');
    elTR.className = 'header';
    
    
    var elTD = document.createElement('td');
    if(strLang=='en')
      elTD.title='Previous Month';  
    elTD.className = 'selectionButton';
    var elA = document.createElement('a');
    elA.setAttribute('href', 'javascript: void(0);');
    ddp.f.addEvent(elA, 'click', function(objEvent){ ddp.f.preventEventDefault(objEvent); });
    elA.appendChild(document.createTextNode('<'));
    
    elTD.appendChild(elA);
    ddp.f.addEvent(elTD, 'click', function(objEvent){ ddp.f.cancelEvent(objEvent); createTable(displayYear, displayMonth-1, elElement); });
    ddp.f.addEvent(elTD, 'mouseover', function(){ddp.f.addClass(this, 'selectionButtonHover');});
    ddp.f.addEvent(elTD, 'mouseout', function(){ddp.f.removeClass(this, 'selectionButtonHover');});
    elTR.appendChild(elTD);

    var elTD = document.createElement('td');
    elTD.setAttribute('colSpan', '5');
    var elSelect = document.createElement('select');
    var arMonths = ddp.l.monthName[strLang];
    for(var i=0; i<12; i++){
      elSelect.options[elSelect.options.length] = new Option(arMonths[i],i+1);
    }
    elSelect.value = displayMonth;
    ddp.f.addEvent(elSelect, 'change', function(){ createTable(displayYear, this.value, elElement); });
    elTD.appendChild(elSelect);
    elTR.appendChild(elTD);

    
    var elTD = document.createElement('td');
    elTD.title='Next Month';
    elTD.className = 'selectionButton';
    
    var elA = document.createElement('a');
    elA.setAttribute('href', 'javascript: void(0);');
    ddp.f.addEvent(elA, 'click', function(objEvent){ ddp.f.preventEventDefault(objEvent); });
    elA.appendChild(document.createTextNode('>'));
    
    elTD.appendChild(elA);
    ddp.f.addEvent(elTD, 'click', function(objEvent){ ddp.f.cancelEvent(objEvent); createTable(displayYear, displayMonth+1, elElement); });
    ddp.f.addEvent(elTD, 'mouseover', function(){ddp.f.addClass(this, 'selectionButtonHover');});
    ddp.f.addEvent(elTD, 'mouseout', function(){ddp.f.removeClass(this, 'selectionButtonHover');});
    elTR.appendChild(elTD);
    
    elTableBody.appendChild(elTR);
    
    var elTR = document.createElement('tr');
    elTR.className = 'header';
    
    var arDayNames = ddp.l.dayName[strLang];
    for(var i=0;i<7;i++){
      var elTD = document.createElement('th');
      elTD.title = arDayNames[i];
      elTD.appendChild(document.createTextNode(arDayNames[i].substring(0,3)));
      elTR.appendChild(elTD);
    }
    elTableBody.appendChild(elTR);
    
    
    var dayOfMonth = 1;
    
    for(var week=0; week<6; week++){
      var elTR = document.createElement('tr');
      for(var dayOfWeek=0; dayOfWeek < 7; dayOfWeek++){
        var elTD = document.createElement('td');
        
        if( (week==0 && dayOfWeek>=startDayOfWeek) || (week>0 && dayOfMonth<=daysInMonth) ){
          elTD.title = ddp.f.dateFormat(displayMonth, dayOfMonth, displayYear, formatType, strLang);
          if(dayOfMonth == selectedDay && displayYear == selectedYear && displayMonth == selectedMonth){
            elTD.className = 'selected';
            if(strLang=='en')
              elTD.title += ' (Current Selection)';
          }
          else if(dayOfMonth == currentDay && displayMonth == currentMonth && displayYear == currentYear){
            elTD.className = 'current';
            elTD.title += ' (' + ddp.l.today[strLang] + ')';
          }
          else if (dayOfWeek == 0 || dayOfWeek == 6)
            elTD.className = 'weekend';
          else
            elTD.className = 'weekday';
          var elA = document.createElement('a');
          elA.setAttribute('href', 'javascript: void(0);');
          ddp.f.addEvent(elA, 'click', function(objEvent){ ddp.f.preventEventDefault(objEvent); });
          elA.appendChild(document.createTextNode(dayOfMonth));
          elTD.appendChild(elA);
          //elTD.appendChild(document.createTextNode(dayOfMonth));
          elTD.currentYear = displayYear;
          elTD.currentMonth = displayMonth;
          elTD.dayOfMonth = dayOfMonth;
          
          ddp.f.addEvent(elTD, 'mouseover', function(){ddp.f.addClass(this, 'cellHover');});
          ddp.f.addEvent(elTD, 'mouseout', function(){ddp.f.removeClass(this, 'cellHover');});
          ddp.f.addEvent(elTD, 'click', function(){
            if(elElement && !elElement.disabled && !elElement.readOnly){
              elElement.value = ddp.f.dateFormat(this.currentMonth, this.dayOfMonth, this.currentYear, formatType, strLang);
              changeBlurAndFocus();
            }
            hide();
          });
          dayOfMonth++;
        }
        else{
          elTD.className = 'empty';
          elTD.innerHTML = '&nbsp;';
        }
        
        elTR.appendChild(elTD);
        //if(week==4 && dayOfWeek==6 && dayOfMonth>daysInMonth) //skip the last week if it's going to be empty
        //  week = 6;
      }
      elTableBody.appendChild(elTR);
    }
    elNewTable.appendChild(elTableBody);

    var elTR = document.createElement('tr');
    elTR.className='header';
    
    var elTD = document.createElement('td');
    elTD.setAttribute('colSpan', '3');
    elTD.title = (strLang=='en') ? 'Clear The Date Input' : ddp.l.clear[strLang];
    elTD.className = 'selectionButton';
    var elA = document.createElement('a');
    elA.setAttribute('href', 'javascript: void(0);');
    ddp.f.addEvent(elA, 'click', function(objEvent){ ddp.f.preventEventDefault(objEvent); });
    elA.appendChild(document.createTextNode(ddp.l.clear[strLang]));
    
    elTD.appendChild(elA);
    ddp.f.addEvent(elTD, 'click', function(){
      if(elElement && !elElement.disabled && !elElement.readOnly){
        elElement.value = '';
        changeBlurAndFocus();
      }
      hide();
    });
    ddp.f.addEvent(elTD, 'mouseover', function(){ddp.f.addClass(this, 'selectionButtonHover');});
    ddp.f.addEvent(elTD, 'mouseout', function(){ddp.f.removeClass(this, 'selectionButtonHover');});
    elTR.appendChild(elTD);
    
    var elTD = document.createElement('td');
    //elTD.className = 'empty';
    elTD.appendChild(document.createTextNode(' '));
    elTR.appendChild(elTD);
    
    var elTD = document.createElement('td');
    elTD.setAttribute('colSpan', '3');
    elTD.title = (strLang=='en') ? 'Close The Calendar' : ddp.l.close[strLang];
    elTD.className = 'selectionButton';
    
    var elA = document.createElement('a');
    elA.setAttribute('href', 'javascript: void(0);');
    ddp.f.addEvent(elA, 'click', function(objEvent){ ddp.f.preventEventDefault(objEvent); });
    
    elA.appendChild(document.createTextNode(ddp.l.close[strLang]));
    elTD.appendChild(elA);
    ddp.f.addEvent(elTD, 'click', function(){ hide(); changeBlurAndFocus(); });
    ddp.f.addEvent(elTD, 'mouseover', function(){ddp.f.addClass(this, 'selectionButtonHover');});
    ddp.f.addEvent(elTD, 'mouseout', function(){ddp.f.removeClass(this, 'selectionButtonHover');});
    elTR.appendChild(elTD);
    
    elTableBody.appendChild(elTR);
    
    elContainer.replaceChild(elNewTable, elContainer.firstChild);
    if(elContainer.style.display == 'block' && elFirstCalendarElement.focus){
      elFirstCalendarElement.focus();
    }
  }
  
  
  function changeBlurAndFocus(){
    if(elElement){
      ddp.f.fireEvent(elElement, 'change');
      ddp.f.fireEvent(elElement, 'blur');
      ddp.f.fireEvent(elElement, 'focus');
      if(elElement.focus)
        elElement.focus();
    }
  }
  
}


/**************************************************/
//Export the public functions to a public namespace
/**************************************************/

var ddpns = ddp.gui;
ddpns.infobox = infobox;
ddpns.addDateFieldButtons = addDateFieldButtons;
ddpns.CalendarControl = CalendarControl;
})();

