(function(){
    /**
     * Define TC global object. This will serve as the namespace for all
     * TC specific JavaScript.
     */
    var TC;
    if (typeof TC === "undefined") {
            TC = {};
    } else if (typeof TC !== "object") {
            throw new Error("TC already exists but is not an object.");
    } else {
            throw new Error("TC already exists as an object.");
    }

    TC.reloadInterval = {
        seconds: 60,
        inMilliseconds: function () {
            return this.seconds*1000;
        },
        inSeconds: function () {
            return this.seconds;
        },
        inMinutes: function () {
            return this.seconds/60;
        },
        toString: function () {
            var secondsInA = {
                day: 86400,
                hour: 3600,
                minute: 60
            };
            var totals = {};
            var seconds = this.seconds;
            
            for (divider in secondsInA) {
                totals[divider] = Math.floor(seconds/secondsInA[divider]) || 0;
                seconds = seconds % secondsInA[divider];
            }
            totals.seconds = seconds;
            
            var readableTime = totals.day + "d "
                + totals.hour + "h "
                + totals.minute + "m "
                + totals.seconds + "s";
            return readableTime;
        }
    };
    
    TC.getTimestamp = function (simple) {
        if (simple) {
            return new Date();
        } else {
            var date = new Date();
            var result = '<time datetime=' + date.getFullYear()
                + '-' + date.getMonth()
                + '-' + date.getDate()
                + 'T' + date.getHours()
                + ':' + date.getMinutes()
                + ':' + date.getSeconds();
            var timezoneOffset = date.getTimezoneOffset();
            timezoneOffset = Math.floor(timezoneOffset / 60);
            if (timezoneOffset == 0) {
                timezoneOffset = 'Z';
            } else if (timezoneOffset > 0) {
                timezoneOffset = '+' + timezoneOffset + ':00';
            } else {
                timezoneOffset = '-' + timezoneOffset + ':00';
            }
            result += timezoneOffset;
            result += '>' + date + '</time>';
            return result;
        }
    };
    
    TC.history = {
        successes: 0,
        failures: 0
    };

	TC.original_title = document.title;
	TC.status = false;
	
	TC.loadIt = function () {
		$.ajax({
		    url: "./testresult.php",
		    cache: false,
		    dataType: "text",
		    complete: function(XMLHttpRequest, textStatus) {
                document.title = '(+' + TC.history.successes + ')(-' + TC.history.failures + ')' + TC.original_title;
		    },
		    success: function (data, textStatus) {
		        var date = TC.getTimestamp(true);
		        var elemID = document.getElementById('result');
		        elemID.innerHTML = '<p>Success at ' + date + ' on ' + data + '</p>' + elemID.innerHTML;
				TC.history.successes++;
		    },
		    error: function (XMLHttpRequest, textStatus, errorThrown) {
		        var date = TC.getTimestamp(true);
		        var elemID = document.getElementById('result');
		        elemID.innerHTML = '<p class="fail">Failure at ' + date + '(Reason: ' + textStatus + ')</p>' + elemID.innerHTML;
				TC.history.failures++;
		    }
		});
	};
	
	TC.startTest = function () {
		//test the connection once
		TC.loadIt();
		
		//test the connection repeatedly
		TC.reloadInterval.id = window.setInterval(TC.loadIt, TC.reloadInterval.inMilliseconds());
	};
	
	TC.stopTest = function () {
		//stop running
		window.clearInterval(TC.reloadInterval.id);
	};
	
	TC.toggleTest = function () {
		TC.status = !TC.status;
        TC.status ? TC.startTest() : TC.stopTest();
		TC.updateStatus();
	};
	
	TC.updateStatus = function () {
		//change text in start/stop button
		TC.status ? document.getElementById("status").innerHTML = 'Stop' : document.getElementById("status").innerHTML = 'Start' ;
		//change css class of start/stop button
		TC.status ? document.getElementById("statusbutton").className = "stop" : document.getElementById("statusbutton").className = "";		
	};
	
	TC.setup = function () {
		//show the reloadInterval on screen
		document.getElementById("testinterval_show").innerHTML = TC.reloadInterval;

        document.getElementById("statusbutton").onclick = TC.toggleTest;
		
		TC.updateStatus();
	};

    $(document).ready(function(){
        TC.setup();
    });

})();