    var oDNS="http://www.eastcapebookings.co.za";
    var oCssLoc="/css/acal/";
    var oImgLoc="/images/obj/";
    var oCaller="/lookups/aCalendar.aspx";
    var oBookingCaller="/lookups/acBookingRequest.aspx";
    var oProgBar='<img src="'+oDNS+'/images/obj/snake.gif"/> Loading Calendar...';
    var oHostname=document.location.hostname;
    var arrStyles = new Array();
    var Month=0;
    var _INSTANCE_NAME;
    var _ADULTS = 0;
    var _CHILDREN = 0;
    var _AC_GUEST_QTY = 0;

    function ACal(oDOM) {
        //Div object for content
        this.target=oDOM;
        this.clientType=0;
        this.clientURL='';
        this.targetRollback=oDOM.innerHTML;
        this.form="";
        this.theme=new Theme();
        this.month=0;
        this.listControl=new ListControl();
        this.navControl=new NavigationControl();
     }
     //---------------------------------------------------
         function Style(oName,sStyle) {
            this.cssElementName=oName;
            this.cssText=sStyle;
         }
         function ListControl() {
            this.identity='listControl';
            this.active=0;
            this.length=5;
            this.styles=new ListStyles();
         }
         //-----------------------------------------------
            function ListStyles() {
                this.cssDates='listMonths';
                this.cssEvents='listEvents';
            }
            //--------------------------------------------    
         function WallpaperControl() {
            this.identity='wallpaperControl';
            this.active=0;
         }
         function Theme() {
            //Default stylesheet and default CSS classes for html.
            this.styleSheet='default';
            this.cssClasses=new ThemeStyles();
            this.styles=new Style('','');
         }
         //-----------------------------------------------
             function ThemeStyles() {
                this.cssHeader='hdr';
                this.cssDay='blocks';
                this.cssSelDay='blocks';
             }
        function NavigationControl() {
            this.identity='navControl';
            this.active=0;
            this.styles=new NavStyles
        }
        //-------------------------------------------------
            function NavStyles() {
                this.cssButtons='navButtons';
            }
    ACal.prototype.addStyleSheet = function () {
        var elm=document.createElement("link");
        elm.setAttribute("rel", "stylesheet");
        elm.setAttribute("type", "text/css");
        elm.setAttribute("href", oDNS+oCssLoc+this.theme.styleSheet+".css");
        if (typeof elm!="undefined") {
            document.getElementsByTagName("head")[0].appendChild(elm);
        }
    }        
    ACal.prototype.addCalendar = function (strInstanceName) {
        _INSTANCE_NAME = strInstanceName;
        
        var CalendarHTML = "";
        //var TargetTmp = this.target.innerHTML;
        var param = ""
        
        param += 'mn_'+this.month+"-";
        param += 'lc_'+this.listControl.active+"-";
        param += 'lcl_'+this.listControl.length+"-";
        param += 'nc_'+this.navControl.active;
        
        this.addStyleSheet();
        this.target.innerHTML=oProgBar;
        
        var jsonCalendar = document.createElement("script");
	    jsonCalendar.setAttribute("src",oDNS+oCaller+'?mn='+this.month+'&host='+ oHostname+'&instance='+ strInstanceName+'&adult='+_ADULTS+'&child='+_CHILDREN+'&qty_init='+_AC_GUEST_QTY);
	    document.getElementsByTagName("body").item(0).appendChild(jsonCalendar);
    };
    ACal.prototype.addControl = function (oControl) {
        switch (oControl.identity) {
            case 'listControl': 
                this.listControl = oControl; 
                oControl.active=1;
                break;
            case 'wallpaperControl': 
                this.wallpaperControl = oControl; 
                oControl.active=1;
                break;
            case 'navControl': this.navControl = oControl; 
                oControl.active=1;
                break;
       }
    };
    ACal.prototype.runtimeStyles = function () {
        for (var i = 0; i < this.theme.styles.length; i++) {
            this.setStyle(this.theme.styles[i].cssElementName,this.theme.styles[i].cssText);
        }
    };
    ACal.prototype.setStyle = function (oName,sStyle) {
        var doc = document.getElementsByName(oName);
        for (var i=0; i<doc.length; i++) {doc[i].style.cssText=sStyle;}
    };
    ACal.prototype.addTheme = function (oTheme) {
        this.theme=oTheme;
    };
    ACal.prototype.setMonth = function (iMonths) {
       this.month=this.month+iMonths;
    };
    ListControl.prototype.addStyles = function (oStyles) {
       this.styles=oStyles;
    };
    Theme.prototype.addCssClass = function (oStyles) {
       this.cssClasses=oStyles;
    };
    Theme.prototype.addStyle = function (oStyles) {
       arrStyles.push(oStyles);
       this.styles=arrStyles;
    };
    ACal.prototype.render = function (obj) {
        if (obj.content.trim() == '') {
            this.target.innerHTML = this.targetRollback;
        } else {
            this.target.innerHTML=obj.content.replace(/&lt;/g,'<').replace(/&gt;/g,'>');
            this.clientType=obj.type;
            this.runtimeStyles();
            this.clientURL=obj.url;
            
            if (this.clientType=="2") {
                this.form=obj.form.replace(/&lt;/g,'<').replace(/&gt;/g,'>');
                this.theme.styleSheet='png';
                this.addStyleSheet();
            }
            
            _AC_GUEST_QTY = parseInt(obj.enquiry);
            eval(obj.instance+'.target').style.height='auto';
            setupGuestSelects();
        
            EBI("ecal_prv").onclick = function() {eval(obj.instance+'.setMonth(-1);'+obj.instance+'.addCalendar("'+obj.instance+'")');};
            EBI("ecal_nxt").onclick = function() {eval(obj.instance+'.setMonth(1);'+obj.instance+'.addCalendar("'+obj.instance+'")');};
        }
    }
    function jsonEcalCaller(obj) {
        oTarget.innerHTML=obj.name.replace(/&lt;/g,'<').replace(/&gt;/g,'>');
        //this.runtimeStyles();
        
        EBI("ecal_prv").onclick = function() {eval(obj.instance+'.setMonth(-1);'+obj.instance+'.addCalendar("'+obj.instance+'")');};
        EBI("ecal_nxt").onclick = function() {eval(obj.instance+'.setMonth(1);'+obj.instance+'.addCalendar("'+obj.instance+'")');};
    }
    
    var sStartCell = '';
    var sEndCell = '';
    var sStartYear = '';
    var sEndYear = '';
    function dateSelection(objId, strYear) {
        if (_AC_GUEST_QTY !== 0) {
            if (sStartCell == '') {
                EBI(objId).style.background = '#ffffcc';
                sStartCell = objId;
                sStartYear = strYear;
                sEndCell = '';
                sEndYear = '';
            } else {
                if (sEndCell == '') {
                    sEndCell = objId;
                    sEndYear = strYear;
                    checkAvailability();
                } else {
                    EBI(objId).style.background = '#ffffcc';
                    sStartCell = objId;
                    sStartYear = strYear;
                    sEndCell = '';
                    sEndYear = '';
                }
            }
        } else {
            alert("1. Please select the number of Guests you require.\n2. Click Show Availability.");
        }
    }
    
    function checkAvailability() {
        var StartMonth = parseInt(sStartCell.substring(sStartCell.indexOf("_")+1,sStartCell.indexOf("-")));
        var EndMonth = parseInt(sEndCell.substring(sEndCell.indexOf("_")+1,sEndCell.indexOf("-")));
        var StartDay = parseInt(sStartCell.substring(sStartCell.indexOf("-")+1,sStartCell.length));
        var EndDay = parseInt(sEndCell.substring(sEndCell.indexOf("-")+1,sEndCell.length));
        
        var tmpStartMonth = StartMonth;
        var tmpStartDay = StartDay;
        
        var tmpEndDay = EndDay;
            
        var isAvailable = true;
        var sStartCellBgrnd = EBI(sStartCell).style.background;
        
        //RESET CALENDAR DAYS.
        resetAvailability(StartMonth-1, 1, EndMonth+1, 31);
        
        if (EndMonth - StartMonth < -1 || EndMonth - StartMonth >= 2) {
            EndMonth = EndMonth + 12;
        }
        
        if ((StartMonth == EndMonth && StartDay > EndDay) || (StartMonth > EndMonth)) {
            StartMonth = EndMonth;
            EndMonth = tmpStartMonth;
            StartDay = EndDay;
            EndDay = tmpStartDay;
            
            tmpStartDay = StartDay;
            tmpStartMonth = StartMonth;
            
            sEndCell = sStartCell;
        }
        
        
        
        //END OF YEAR BUG QUICK FIX.
        if (StartMonth == 24 || EndMonth == 24) {
            EndMonth = 13;
            StartMonth = 12;
            StartDay = EndDay;
            EndDay = tmpStartDay;
            
            tmpStartDay = StartDay;
            tmpStartMonth = StartMonth;
            
            sEndCell = sStartCell;
        }
        
        
        
        while (StartMonth<=EndMonth) {
            while ((StartDay <= EndDay || StartMonth<=EndMonth) && (EBI('day_' + StartMonth + '-' + StartDay) !== null || EBI('day_' + (StartMonth-12) + '-' + StartDay) !== null) || StartMonth == 13) {
                var NewYear_StartMonth = StartMonth;
                var NewYear_EndMonth = EndMonth;
                
                //END OF YEAR BUG QUICK FIX.
                if (StartMonth == 13) {
                    StartMonth = 1;
                }
                if (EndMonth == 13) {
                    EndMonth = 1;
                }
                
                if (EBI('day_' + StartMonth + '-' + StartDay).className == 'ecal_day_dead' && EBI('day_' + EndMonth + '-' + EndDay).id !== EBI('day_' + StartMonth + '-' + StartDay).id) {
                    EBI('day_' + StartMonth + '-' + StartDay).style.background = '#d91616';
                    isAvailable = false;
                } else {
                    EBI('day_' + StartMonth + '-' + StartDay).style.background = '#ffffcc';
                }
                
                if (('day_' + StartMonth + '-' + StartDay) == sEndCell) {
                    StartMonth = NewYear_StartMonth;
                    break;
                }
                EndMonth = NewYear_EndMonth;
                StartMonth = NewYear_StartMonth;
                StartDay++;
            }
            StartDay = 1;
            StartMonth++
        }
        
        if (isAvailable == false) {
            alert('Sorry we do not have availability for your date range. \nPlease review your selection and try different dates.');
        } else {
            if (eval(_INSTANCE_NAME).clientType == "2") {
                // The number of milliseconds in one day
                var ONE_DAY = 1000 * 60 * 60 * 24
                createOverlay();
                
                eval(_INSTANCE_NAME).theme.styleSheet='frm';
                eval(_INSTANCE_NAME).addStyleSheet();
                
                
                //NEW YEAR BUG QUICK FIX.
                var tmpStart_Year = sEndYear;
                var tmpEnd_Year = sStartYear;
                if (EndMonth == 13) { EndMonth = 1; sStartYear = tmpStart_Year; sEndYear=tmpEnd_Year;alert("asdasdasd");}
                if (tmpStartMonth == 13) { 
                    tmpStartMonth = 1; tmpStartDay = tmpEndDay; }
                
                var dtCheckIn = new Date(sStartYear,tmpStartMonth-1,tmpStartDay);
                var dtCheckOut = new Date(sEndYear,EndMonth-1,EndDay);
                
                EBI('ac_Arrival').value= tmpStartMonth + '/' + tmpStartDay + '/' + sStartYear;
                EBI('ac_Departure').value= EndMonth+'/'+EndDay+'/'+sEndYear;
                EBI('ac_NoNights').value=Math.round((dtCheckOut-dtCheckIn)/ONE_DAY)
                EBI('ac_Adults').value=_ADULTS;
                EBI('ac_Children').value=_CHILDREN;
                
                EBI('ac_frm_checkin').innerHTML = tmpStartMonth + '/' + tmpStartDay + '/' + sStartYear;
                EBI('ac_frm_checkout').innerHTML = EndMonth+'/'+EndDay+'/'+sEndYear; 
                EBI('ac_frm_nonights').innerHTML = Math.round((dtCheckOut-dtCheckIn)/ONE_DAY);
                EBI('ac_frm_noadults').innerHTML = _ADULTS;
            } else {
                window.open(eval(_INSTANCE_NAME+'.clientURL') + '?checkin=' + tmpStartMonth + '/' + tmpStartDay + '/' + sStartYear + '&checkout=' + EndMonth+'/'+EndDay+'/'+sEndYear ,'EastCapeBooking');
            }
        }
    }
    
    function resetAvailability(dStartMonth, dStartDay, EndMonth, EndDay) {
        if (dStartMonth == 11 || dStartMonth == 0 || EndMonth == 11 || EndMonth == 0) {resetCalendarMonth(12);resetCalendarMonth(1);}
        while (dStartMonth<=EndMonth) {
            while ((dStartDay <= EndDay || dStartMonth<=EndMonth) && document.getElementById('day_' + dStartMonth + '-' + dStartDay) !== null) {
                document.getElementById('day_' + dStartMonth + '-' + dStartDay).style.background = '';
                dStartDay++;
            }
            dStartDay = 1;
            dStartMonth++
        }
    }
    function resetCalendarMonth(iMonth) {
        var calStartDay = 1;
        while (calStartDay <=31 && document.getElementById('day_' + iMonth + '-' + calStartDay) !== null) {
            document.getElementById('day_' + iMonth + '-' + calStartDay).style.background = '';
            calStartDay++;
        }
    }
    String.prototype.trim = function() {
	    return this.replace(/^\s+|\s+$/g,"");
    }
    function getDocHeight() {
        var D = document;
        return Math.max(
            Math.max(D.body.scrollHeight, D.documentElement.scrollHeight),
            Math.max(D.body.offsetHeight, D.documentElement.offsetHeight),
            Math.max(D.body.clientHeight, D.documentElement.clientHeight)
        );
    }
    
    function ac_SetGuests() {
        _ADULTS = EBI('ac_NoOfAdults').value;
        _CHILDREN = EBI('ac_NoOfChildren').value;
        
        if (_ADULTS == 0 && _CHILDREN == 0) {
            alert('Please select the number of Guests you require.');
        } else {
            _AC_GUEST_QTY = 1;
            eval(_INSTANCE_NAME+'.addCalendar("'+_INSTANCE_NAME+'")');
        }
    }
    function ac_ResetGuests() {
        _AC_GUEST_QTY = 0;
    }
    function ac_ValidateBooking() {
        var sErr = '';
        var sFullName = EBI('ac_FirstName'); 
        var sEmail = EBI('ac_Email'); 
        var sContact = EBI('ac_ContactNo'); 
        var sAdults = EBI('ac_Adults'); 
        var sChildren = EBI('ac_Children'); 
        var sArrival = EBI('ac_Arrival'); 
        var sDeparture = EBI('ac_Departure'); 
        var sTime = EBI('ac_Time'); 
        var sComments = EBI('ac_Comments'); 
        EBI('ac_lblMsg').innerHTML=sErr;
        
        if (sFullName.value == '') {
            sErr += 'Please enter your fullname.<br/>';
        }
        if (sEmail.value == '') {
            sErr += 'Please enter your email address.<br/>';
        }
        if (!isValidEmail(sEmail.value)) {
            sErr += 'Please enter a valid email address.<br/>';
        }
        if (sErr !== '') {
            document.getElementById('ac_lblMsg').innerHTML=sErr;
            return;
        }
        sendBookingRequest('?host='+oHostname+'&name='+sFullName.value+'&email='+sEmail.value+'&contact='+sContact.value+'&adults='+sAdults.value+'&children='+sChildren.value+'&checkin='+sArrival.value+'&checkout='+sDeparture.value+'&time='+sTime.value+'&comments='+sComments.value);
    }
    
    function ac_CloseEnquiry() {
        EBI('acal_Overlay').style.display='none';
        window.onscroll='';
    }
    function createOverlay() {
        window.onscroll=scrollHandler;
        if (EBI('acal_Overlay')) {
            EBI('acal_Overlay').style.display='block';
        } else {
            var ac_DivForm = document.createElement("div");
            
            ac_DivForm.id='ac_Form';
            ac_DivForm.innerHTML = eval(_INSTANCE_NAME).form.replace(/&lt;/g,'<').replace(/&gt;/g,'>');
        
            var newdiv = document.createElement('div');
            newdiv.id="acal_Overlay";
            newdiv.style.width = "100%";
            newdiv.style.height = getDocHeight()+'px';
            newdiv.style.left = "0px";
            newdiv.style.top = "0px";
            newdiv.style.position = "absolute";
            newdiv.style.zIndex = 400;
            newdiv.style.background = "url('http://www.eastcapebookings.co.za/images/overlay/gry_85.png') repeat";
            newdiv.appendChild(ac_DivForm);
            document.body.appendChild(newdiv); 
          }
    }
    function sendBookingRequest(sQueryStrings) {
        var jsonCalendar = document.createElement("script");
	    jsonCalendar.setAttribute("src",oDNS+oBookingCaller+sQueryStrings);
	    document.getElementsByTagName("body").item(0).appendChild(jsonCalendar);
    }
    
    function viewEnquiry(obj) {
        if (obj.status == 'success') {
            EBI('ac_lblMsg').innerHTML='Your enquiry has successfully been sent.'
            EBI('ac_lblMsg').style.color='blue';
            setTimeout('ac_CloseEnquiry()', 2000);
        } else {
            EBI('ac_lblMsg').innerHTML='Your enquiry has failed, please try again later or contact the establishment.'
            EBI('ac_lblMsg').style.color='blue';
        }
    }
    
    function isValidEmail(str) {
        return (str.indexOf(".") > 2) && (str.indexOf("@") > 0);
    }
    
    function scrollHandler() {
        EBI('acal_Overlay').style.background = "url('http://www.eastcapebookings.co.za/images/overlay/gry_85.png') repeat";
    }
    function setupGuestSelects() {
        if (EBI('ac_NoOfChildren').options.length <= 1) {
           EBI('ac_NoOfChildren').style.display='none';
           EBI('ac_NoOfAdults').className='ac_NoOfAdults_or';
        }
    }
    function EBI(objId) {
        return document.getElementById(objId);
    }
    function daysSince() {
        var startingdate=new Date(2009, 0, 1) //Month is 0-11 in JavaScript
        var today=new Date()
        //Get 1 day in milliseconds
        var one_day=1000*60*60*24

        //Calculate difference btw the two dates, and convert to days
        alert(Math.ceil((today.getTime()-startingdate.getTime())/(one_day)))

    }


 

