/*
Copyright (c) 2006, E4Education
Code licensed soley for use by E4Education
Author: Grant French, E4Education, 2006
Version 0.1
*/

/**
* Javascript library used by the e4e-cms calendar application
*/

    var baseDate;

    var intTimer,pos;
    var speed=0;
    var minSpeed=20;
    var calendarSlideTimeoutID;

    var calendarDayWidth=95; //Calendar day width in the css +2 (for the border)

    var weekDays = new Array(); weekDays[0]="Sun"; weekDays[1]="Mon"; weekDays[2]="Tue"; weekDays[3]="Wed"; weekDays[4]="Thu"; weekDays[5]="Fri"; weekDays[6]="Sat";
    var monthNames = new Array(); monthNames[0]="Jan"; monthNames[1]="Feb"; monthNames[2]="Mar"; monthNames[3]="Apr"; monthNames[4]="May"; monthNames[5]="Jun"; monthNames[6]="Jul"; monthNames[7]="Aug"; monthNames[8]="Sept"; monthNames[9]="Oct"; monthNames[10]="Nov"; monthNames[11]="Dec";

    var calendar_key = new Array();

    var xmlReq = new XMLRequester();
    xmlReq.connectorPath = "/calendar/xmlData.asp";

    function calendar_trim(sInString) {
    sInString = sInString.replace( /^\s+/g, "" );// strip leading
    return sInString.replace( /\s+$/g, "" );// strip trailing
    }

    function calendar_onLoad() {

    baseDate = currentDate;
    var jsElem = document.getElementById('calendar_css_check')

    if (readCookie('calendar_disable_js')=='1') {

        /*Check that our stylesheets are enabled in the browser*/
        //jsElem.innerHTML = "You currently have javascript disabled for this part of the website, <input type=\"button\" value=\"Re-Enable Javascript\" onclick=\"createCookie('calendar_disable_js','0',365); document.location.reload();\"/>";
        jsElem.style.display="block";

    } else {

        document.getElementById('calendar_disableEffectsContainer').innerHTML='<label for="calendar_disableEffects">Disable Effects</label>: <input type="checkbox" name="calendar_disableEffects" id="calendar_disableEffects" value="on" />';

        jsElem.style.marginLeft='-5000px';
        //jsElem.innerHTML = "Please disable javascript for correct rendering without css <input type=\"button\" value=\"Disable Javascript\" onclick=\"createCookie('calendar_disable_js','1',365); document.location.reload();\"/>";

        if ( calendar_requirementsCheck() ) {

            calendar_getKeyColours();

            //Set the default position of the slider
            pos = currentDate.getDate() * calendarDayWidth;

            //Register an AJAX handler for the GetEvents command
            xmlReq.registerHandler("GetEvents",calendar_dataLoader );

            //Register an AJAX handler for the GetEventDetails command
            xmlReq.registerHandler("GetEventDetails",calendar_eventLoader );

            //Complete the day numbers either side of the 3 pre loaded ones
            calendar_fillOutMonthTable();

            //Load disable effects tick box state
            document.getElementById('calendar_disableEffects').checked = readCookie("calendar_disableEffects")=="1"?true:false;

            //Register a click handler on all day links
            calendar_attachToDayLinks()

            //Register a click handler on all day links
            calendar_attachToHeaderLinks()

            //Goto the selected date and load data
            calendar_gotoDay(currentDate.getDate());

        } else {
            if (!readCookie('calendar_js_warning_displayed')) {
                createCookie('calendar_js_warning_displayed','1',14);
                alert("You have javascript enabled but your browser doesnt support\n one or more features required by this application\n I will continue loading the non javascript version.");
            }
        }

    }

    }


    function getStyle(element, cssAttribute){
        if(element.currentStyle) return element.currentStyle[cssAttribute];
        else if(document.defaultView && document.defaultView.getComputedStyle) return document.defaultView.getComputedStyle(element, null).getPropertyValue(cssAttribute);
        return "false";
    }


    function calendar_requirementsCheck() {

        return (document.getElementById && document.getElementsByTagName) && (window.XMLHttpRequest || (window.ActiveXObject && new ActiveXObject("MsXml2.XmlHttp")));

    }


    function calendar_getKeyColours() {
        var keyList = document.getElementById('calendar_key');
        if (keyList) {
            calendars=keyList.getElementsByTagName('li');
            for (var i=0;i<calendars.length;i++) {
                calendar_key[calendars[i].innerHTML]=calendars[i].style.backgroundColor;
            }
        }
    }

    function calendar_attachToDayLinks() {

        //getElementsByTagName must be supported to proceed
        if (!document.getElementsByTagName){ return; }
        var anchors = document.getElementsByTagName('a');

        // loop through all anchor tags
        for (var i=0; i<anchors.length; i++) {

            //If the anchor has a href and its rel attribute is set to calday then set a click handler on it
            if (anchors[i].getAttribute('href') && (String(anchors[i].getAttribute('rel')).toLowerCase().match('calday'))) anchors[i].onclick = calendar_dayClickHandler

        }

    }


    function calendar_attachToHeaderLinks() {

        //getElementsByTagName must be supported to proceed
        if (!document.getElementsByTagName){ return; }
        var anchors = document.getElementsByTagName('a');

        // loop through all anchor tags
        for (var i=0; i<anchors.length; i++) {

            //If the anchor has a href and its rel attribute is set to calheader then set a click handler on it
            if (anchors[i].getAttribute('href') && (String(anchors[i].getAttribute('rel')).toLowerCase().match('calheader'))) anchors[i].onclick = calendar_headerClickHandler

        }

    }

    //Scroll effect for the calendar week data
    function calendar_prettySlide(start,finish) {
        if (start==-1) start=pos;
        var weekData = document.getElementById('calendar_weekData');

        if (start<finish) {

            //If in the last half
            if (pos<(start+((finish-start)*0.5))) speed=((pos-start) / ((finish-start)*0.4)) * 50;

            //If in the first half
            if (pos>(start+((finish-start)*0.5))) speed=100-(pos / (start+(finish-start))) * 100


            if (speed<minSpeed) speed=minSpeed;

            pos = (pos + speed);

        } else if (start>finish) {

            //If in the last half
            if (pos<(finish+((start-finish)*0.5))) speed=((pos-finish) / ((start-finish)*0.4)) * 50;

            //If in the first half
            if (pos>(finish+((start-finish)*0.5))) speed=100-(pos / (finish+(start-finish))) * 100

//alert(speed + "/" + minSpeed);
            if (speed<minSpeed || isNaN(speed)) speed=minSpeed;
            pos = (pos - (speed*2));

        }

        weekData.style.marginLeft = -pos + 'px';

        if ((pos<=finish && start>finish) || (pos>=finish && start<finish)) {
            pos=finish;
            weekData.style.marginLeft = -pos + 'px';
        } else {
            window.clearTimeout(calendarSlideTimeoutID);
            calendarSlideTimeoutID = window.setTimeout("calendar_prettySlide(" + start + "," + finish + ");",40);
        }

    }

    //Load the data for the date to goto, then scroll to that day
    function calendar_gotoDay(x) {

        currentDate.setDate(x);
        var workingDate = new Date(currentDate);

        if (currentDate.getDate()>1) {
            workingDate.setDate( currentDate.getDate()-1 );
            calendar_loadData( workingDate );
        } else {
            workingDate = new Date(Date.parse(workingDate) - (1000*60*60*24))
            calendar_loadData( workingDate );
            workingDate = new Date(currentDate);
        }
        calendar_loadData();

        workingDate.setDate(currentDate.getDate()+1);
        if (workingDate.getMonth()==currentDate.getMonth()) {
            calendar_loadData( workingDate );
        }

        newDate = new Date();
		if ((window.location.search.indexOf("day=1")!=-1) || (window.location.search.indexOf("day=01")!=-1) || (newDate.getDate()==1)) {
			calendar_prettySlide(-1,((x-2)*calendarDayWidth)+calendarDayWidth);
		} else {
			calendar_prettySlide(-1,((x-2)*calendarDayWidth));
		}
    }


    //Complete the day numbers either side of the 3 pre loaded ones
    function calendar_fillOutMonthTable() {

        var calWeekView = document.getElementById('calendar_weekData');
        var createCols = currentDate.getDate()-2;

        var workingDate = new Date( currentDate )
        for (var i=createCols;i>0;i--) {

            workingDate.setDate(i);

            var dayUL = document.createElement("ul");
            dayUL.className='calendar_eventList';

            var headingLI = document.createElement("li");
            headingLI.className = 'calendar_heading';
            headingLI.innerHTML = "<a href=\"default.asp?day=" + workingDate.getDate() + "&month=" + (workingDate.getMonth()+1) + "&year=" + ((currentDate.getYear()<1000)?(currentDate.getYear()+1900):currentDate.getYear()) + "\" rel=\"calHeader\">" + weekDays[workingDate.getDay()] + ", " + monthNames[workingDate.getMonth()] + " " + workingDate.getDate() + "</a>";

            var eventList = document.createElement("ul");
            headingLI.appendChild( eventList );

            dayUL.appendChild( headingLI );

            calWeekView.insertBefore( dayUL, calWeekView.getElementsByTagName('ul')[0] );

        }

        var x=0;
        var workingDate = new Date( currentDate )
        workingDate.setDate( workingDate.getDate() + 1 );

        if ( currentDate.getMonth() == workingDate.getMonth() ) {

            do {
                x++;
                var nextDate = workingDate.getDate() + 1;
                workingDate.setDate(nextDate);
                if (workingDate.getDate() == nextDate) {

                    var dayUL = document.createElement("ul");
                    dayUL.className='calendar_eventList';

                    var headingLI = document.createElement("li");
                    headingLI.className = 'calendar_heading';

                    headingLI.innerHTML = "<a href=\"default.asp?day=" + workingDate.getDate() + "&month=" + workingDate.getMonth() + "&year=" + ((currentDate.getYear()<1000)?(currentDate.getYear()+1900):currentDate.getYear()) + "\" rel=\"calHeader\">" + weekDays[workingDate.getDay()] + ", " + monthNames[workingDate.getMonth()] + " " + workingDate.getDate() + "</a>";

                    var eventList = document.createElement("ul");
                    headingLI.appendChild( eventList );

                    dayUL.appendChild( headingLI );
                    calWeekView.appendChild( dayUL );

                } else break;
            } while (1==1)
        }

    }


    //Handles clicks on the day numbers in the month block
    function calendar_dayClickHandler(evt) {
        evt=(evt)?evt:window.event;

        document.getElementById('calendar_eventDetails').style.display='none';

        if (document.getElementById('calendar_disableEffects').checked) {
            createCookie("calendar_disableEffects","1",365);
            return true;
        } else {
            createCookie("calendar_disableEffects","0",365);
            var dayNo = ((evt.srcElement)?evt.srcElement.innerHTML:evt.target.innerHTML);
            calendar_gotoDay(dayNo); return false;
        }
    }


    //Header click handler
    function calendar_headerClickHandler(evt) {
        evt=(evt)?evt:window.event;

        if (document.getElementById('calendar_disableEffects').checked) {
            createCookie("calendar_disableEffects","1",365);
            return true;
        } else {
            createCookie("calendar_disableEffects","0",365);
            var dayNo = ((evt.srcElement)?evt.srcElement.innerHTML:evt.target.innerHTML);
            dayNo=calendar_trim(dayNo.substr(dayNo.length-2));
            calendar_gotoDay(dayNo); return false;
        }
    }

	function fixedParseInt(strVal) {
		strVal = new String(strVal);
		//IE's version of parseInt is buggy, i.e. parseInt("09") = 0, parseInt("9")=9
		while( strVal.indexOf("0")==0 ) { strVal = strVal.substring(1); }
		return parseInt( strVal );
	}

    function calendar_loadData() {
        if (arguments.length>0) {
            funcDate = new Date( arguments[0] );
            if (funcDate=="Invalid Date") return false;
        } else {
            funcDate = new Date( currentDate );
        }

        var dayNo = funcDate.getDate();

        var actualDay;
        var objForDate = new Date(funcDate);

        if (objForDate.getMonth()!=baseDate.getMonth()) {
            actualDay=1;
        } else {
            if ((window.location.search.indexOf("day=1&")!=-1) || (window.location.search.indexOf("day=01&")!=-1) || (baseDate.getDate()==1)) {
                actualDay=fixedParseInt(dayNo)+1;
            } else {
                actualDay=fixedParseInt(dayNo);
            }
        }

        var calWeekView = document.getElementById('calendar_weekData');
        var calWeekViewULs = array_filter(function(x) { return (x.className=='calendar_eventList'); }, calWeekView.getElementsByTagName("ul"));
        var currentDayUL = calWeekViewULs[actualDay-1];
        var currentDayEventsUL = currentDayUL.getElementsByTagName("ul");
        currentDayEventsUL = currentDayEventsUL[0];

        for(var i=0;i<currentDayEventsUL.childNodes.length;i++)
            currentDayEventsUL.removeChild(currentDayEventsUL.childNodes[0]);

        currentDayEventsUL.innerHTML='';

        var loadingImageLI = document.createElement("li");
            var loadingImage = document.createElement("img");
            loadingImage.src='/_includes/images/calendar/ajax-loader.gif';
        loadingImageLI.appendChild(loadingImage);
        currentDayEventsUL.appendChild(loadingImageLI);

        xmlReq.sendRequest(
            "GetEvents",
            "date=" +
                ((funcDate.getYear()<1000)?(funcDate.getYear()+1900):funcDate.getYear())
                + "-" +
                (new String(funcDate.getMonth()+1).length<2?'0':'') + (""+(funcDate.getMonth()+1))
                + "-" +
                (new String(funcDate.getDate()).length<2?'0':'') + (""+funcDate.getDate()));
    }


    function calendar_dataLoader( xmlResponse ) {
        var xml = xmlResponse.DOMDocument;
        var events = xml.getElementsByTagName("event");

        var forDate = xml.getElementsByTagName("Connector")[0].getAttribute("date");
        var dayNo = forDate.substring(8,10);

        var calWeekView = document.getElementById('calendar_weekData');
        var calWeekViewULs = array_filter(function(x) { return (x.className=='calendar_eventList'); }, calWeekView.getElementsByTagName("ul"));

        var actualDay;
        var objForDate = new Date();
        objForDate.setYear( forDate.substring(0,4) );
        objForDate.setMonth( fixedParseInt(forDate.substring(5,7))-1 );
        objForDate.setDate( forDate.substring(8,10) );

        var newDate = new Date();
        if (objForDate.getMonth()!=currentDate.getMonth()) {
            actualDay=1;
        } else {
            if ((window.location.search.indexOf("day=1&")!=-1) || (window.location.search.indexOf("day=01&")!=-1) || (newDate.getDate()==1)) {
                actualDay=fixedParseInt(dayNo)+1;
            } else {
                actualDay=fixedParseInt(dayNo);
            }
        }


        var currentDayUL = calWeekViewULs[fixedParseInt(actualDay)-1];
        var currentDayEventsUL = currentDayUL.getElementsByTagName("ul");
        currentDayEventsUL = currentDayEventsUL[0];

        for(var i=0;i<currentDayEventsUL.childNodes.length;i++)
            currentDayEventsUL.removeChild(currentDayEventsUL.childNodes[0]);

        currentDayEventsUL.innerHTML='';

        var workingDate = new Date( currentDate )
        for(var i=0;i<events.length;i++) {
            var titles,title, descriptions,description, calendars, startTimes,startTime, endTimes,endTime, allDay;
            titles=title=descriptions=description=calendars=startTimes=startTime=endTimes=endTime=allDay='';

            var eventID=-1;

            var cEvent = events[i];
            eventID = cEvent.getAttribute("id");
            allDay = cEvent.getAttribute("allDay");

            titles = cEvent.getElementsByTagName("title");
            if (titles && titles.length>0 && titles[0].childNodes.length>0) title=titles[0].firstChild.nodeValue;

            descriptions = cEvent.getElementsByTagName("description");
            if (descriptions && descriptions.length>0 && descriptions[0].childNodes.length>0) description=descriptions[0].firstChild.nodeValue;

            calendars = cEvent.getElementsByTagName("calendar");
            if (calendars && calendars.length>0 && calendars[0].childNodes.length>0) calendars=calendars[0].firstChild.nodeValue;

            startTimes = cEvent.getElementsByTagName("startTime");
            if (startTimes && startTimes.length>0 && startTimes[0].childNodes.length>0) startTime=startTimes[0].firstChild.nodeValue;

            endTimes = cEvent.getElementsByTagName("endTime");
            if (endTimes && endTimes.length>0 && endTimes[0].childNodes.length>0) endTime=endTimes[0].firstChild.nodeValue;

            bgColour=calendar_key[calendars];

            var eventTime = document.createElement("span");
            eventTime.className="calendar_time";

            if ((startTime!="" || endTime!="") && (allDay=="" || allDay=="0")) {
                eventTime.innerHTML = timeIntToString(startTime) + " - " + timeIntToString(endTime);
            } else if (allDay=="1"||(allDay!="" && allDay!="0")) {
                eventTime.innerHTML = "All Day";
            }

            var eventLink = document.createElement("a");
            eventLink.title = "View the details of the " + title + " event";
            eventLink.href = "?day=" + workingDate.getDate() + "&month=" + (workingDate.getMonth()+1) + "&year=" + ((currentDate.getYear()<1000)?(currentDate.getYear()+1900):currentDate.getYear()) + "&event=" + eventID;
            eventLink.innerHTML = title;
            eventLink.onclick = calendar_showEvent;

            var eventLI = document.createElement('li');
            eventLI.style.backgroundColor = bgColour;
            eventLI.title = "This event is in the " + calendars + " calendar."
            eventLI.appendChild( eventTime );
            eventLI.appendChild( document.createElement('br') );
            eventLI.appendChild( eventLink );
            currentDayEventsUL.appendChild( eventLI );


        }

    }


    function calendar_eventLoader( xmlResponse ) {

        var xml = xmlResponse.DOMDocument;
        var events = xml.getElementsByTagName("event");
        var dstElement = document.getElementById('calendar_eventDetails');
        var cEvent = events[0];

        var workingDate = new Date( currentDate );

        var titles,title, descriptions,description, calendars, startTimes,startTime, endTimes,endTime, allDay;
        titles=title=descriptions=description=calendars=startTimes=startTime=endTimes=endTime=allDay='';

        eventID = cEvent.getAttribute("id");
        allDay = cEvent.getAttribute("allDay");

        titles = cEvent.getElementsByTagName("title");
        if (titles && titles.length>0 && titles[0].childNodes.length>0) title=titles[0].firstChild.nodeValue;

        descriptions = cEvent.getElementsByTagName("description");
        if (descriptions && descriptions.length>0 && descriptions[0].childNodes.length>0) description=descriptions[0].firstChild.nodeValue;

        calendars = cEvent.getElementsByTagName("calendar");
        if (calendars && calendars.length>0 && calendars[0].childNodes.length>0) calendars=calendars[0].firstChild.nodeValue;

        startTimes = cEvent.getElementsByTagName("startTime");
        if (startTimes && startTimes.length>0 && startTimes[0].childNodes.length>0) startTime=startTimes[0].firstChild.nodeValue;

        endTimes = cEvent.getElementsByTagName("endTime");
        if (endTimes && endTimes.length>0 && endTimes[0].childNodes.length>0) endTime=endTimes[0].firstChild.nodeValue;

        bgColour=calendar_key[calendars];


        if (dstElement.getElementsByTagName("img").length>0) dstElement.removeChild(dstElement.getElementsByTagName("img")[0]);

        var outputTitle = document.createElement("h1")
        outputTitle.innerHTML='Event Details';
        dstElement.appendChild(outputTitle);

        var outputEventDate = document.createElement("h2");
        outputEventDate.innerHTML='Date:';
            var outputEventDateDiv = document.createElement("div");
            outputEventDateDiv.className='time';
            outputEventDateDiv.innerHTML=weekDays[workingDate.getDay()] + " " + workingDate.getDate() + "/" + (workingDate.getMonth()+1) + "/" + (workingDate.getYear()+1900) ;
        dstElement.appendChild(outputEventDate);
        dstElement.appendChild(outputEventDateDiv);

        var outputEventTime = document.createElement("h2");
        outputEventTime.innerHTML='Time:';
            var outputEventTimeDiv = document.createElement("div");
            outputEventTimeDiv.className='time';
            if (allDay=="1") outputEventTimeDiv.innerHTML= 'All Day';
            else  outputEventTimeDiv.innerHTML= timeIntToString(startTime) + ' - ' + timeIntToString(endTime);
        dstElement.appendChild(outputEventTime);
        dstElement.appendChild(outputEventTimeDiv);

        var outputEventTitle = document.createElement("h2");
        outputEventTitle.innerHTML='Title:';
            var outputEventTitleDiv = document.createElement("div");
            outputEventTitleDiv.className='title';
            outputEventTitleDiv.innerHTML=title;
        dstElement.appendChild(outputEventTitle);
        dstElement.appendChild(outputEventTitleDiv);

        var outputEventCalendar = document.createElement("h2");
        outputEventCalendar.innerHTML='Calendar:';
            var outputEventCalendarDiv = document.createElement("div");
            outputEventCalendarDiv.className='calendar';
            outputEventCalendarDiv.innerHTML=calendars;
        dstElement.appendChild(outputEventCalendar);
        dstElement.appendChild(outputEventCalendarDiv);

        var outputEventDescription = document.createElement("h2");
        outputEventDescription.innerHTML='Description:';
            var outputEventDescriptionDiv = document.createElement("div");
            outputEventDescriptionDiv.className='description';
            outputEventDescriptionDiv.innerHTML=description;
        dstElement.appendChild(outputEventDescription);
        dstElement.appendChild(outputEventDescriptionDiv);

    }


    function calendar_showEvent(evt) {
        var evt=(evt)?evt:window.event;
        var srcElement = (evt.srcElement)?evt.srcElement:evt.target;
        var dstElement = document.getElementById('calendar_eventDetails');

        while (srcElement.nodeName!="LI") srcElement = srcElement.parentNode;

        var eventURL = srcElement.getElementsByTagName('a')[0].href.split('=')
        eventID = eventURL[eventURL.length-1];

        dstElement.style.backgroundColor = srcElement.style.backgroundColor;

        var closeButton = document.createElement('input');
        closeButton.type='button';
        closeButton.value='Close';
        closeButton.style.cssFloat='right';
        closeButton.onclick=function() { document.getElementById('calendar_eventDetails').style.display='none'; }

        var loadingImage = document.createElement("img");
        loadingImage.src='/_includes/images/calendar/ajax-loader.gif';
        loadingImage.style.marginLeft = '149px';
        loadingImage.style.marginTop = '100px';
        loadingImage.style.display = 'block';

        dstElement.innerHTML = "&nbsp;";
        dstElement.appendChild( closeButton );
        dstElement.appendChild( loadingImage );

        dstElement.style.display='block';

        xmlReq.sendRequest( "GetEventDetails", "event=" + eventID );

        return false;
    }


    function timeIntToString( intTime ) {
        var strRet = "";
        strRet += ((((''+(intTime/100)).length)==1)?"0":"") + (intTime/100)
        strRet += ":"
        strRet += ((((''+(intTime%100)).length)==1)?"0":"") + (intTime%100)
        return strRet;
    }


/* g3nt00-st0rm */
