﻿/*
NOTES:
- this script does no flash detect; do your own, and don't call loadMovie() unless you mean it
- i had code that set the left margin a div surrounding the movie so that 0 placeholder digits were unseen; removed this for simplicity, so see previous version if we need it again
*/

    var counterMovie = null;
    var isTotalMovie = true;

	function setCounter(num, goDirect)
	{	    
		//parse num as a string
		var s = num + "";
		var num1 = s.substring(0, 1);
		var num2 = s.substring(1, 2);
		var num3 = s.substring(2, 3);
		var num4 = s.substring(3, 4);
		var num5 = s.substring(4, 5);
		var num6 = s.substring(5, 6);
		var num7 = s.substring(6, 7);
		
		//how many digits do we have?
		var count = ((num1) ? 1 : 0) + ((num2) ? 1 : 0) + ((num3) ? 1 : 0) + ((num4) ? 1 : 0) + ((num5) ? 1 : 0) + ((num6) ? 1 : 0) + ((num7) ? 1 : 0);
		
		var ones = -1;
		var tens = -1;
		var hundreds = -1;
		var thousands = -1;
		var tenThousands = -1;
		var hundredThousands = -1;
		var millions = -1;
		
		switch (count)
		{
			case 1:
				ones = num1;
				break;
			case 2:
				ones = num2;
				tens = num1;
				break;				
			case 3:
				ones = num3;
				tens = num2;
				hundreds = num1;
				break;
			case 4:
				ones = num4;
				tens = num3;
				hundreds = num2;
				thousands = num1;
				break;
			case 5:
				ones = num5;
				tens = num4;
				hundreds = num3;
				thousands = num2;
				tenThousands = num1;
				break;
			case 6:
				ones = num6;
				tens = num5;
				hundreds = num4;
				thousands = num3;
				tenThousands = num2;
				hundredThousands = num1;
				break;
			case 7:
				ones = num7;
				tens = num6;
				hundreds = num5;
				thousands = num4;
				tenThousands = num3;
				hundredThousands = num2;
				millions = num1;
				break;
		}

		if (null == counterMovie.SetCounter)
			return false;
		
		if (goDirect)
		{
			counterMovie.SetCounter(ones, tens, hundreds, thousands, tenThousands, hundredThousands, millions, true);
		}
		else
		{			
			counterMovie.SetCounter(ones);
			setTimeout("counterMovie.SetCounter(" + ones + ", " + tens + ")", 50);
			setTimeout("counterMovie.SetCounter(" + ones + ", " + tens + ", " + hundreds + ")", 100);
			setTimeout("counterMovie.SetCounter(" + ones + ", " + tens + ", " + hundreds + ", " + thousands + ")", 150);
			setTimeout("counterMovie.SetCounter(" + ones + ", " + tens + ", " + hundreds + ", " + thousands + ", " + tenThousands + ")", 200);
			setTimeout("counterMovie.SetCounter(" + ones + ", " + tens + ", " + hundreds + ", " + thousands + ", " + tenThousands + ", " + hundredThousands + ")", 250);
			setTimeout("counterMovie.SetCounter(" + ones + ", " + tens + ", " + hundreds + ", " + thousands + ", " + tenThousands + ", " + hundredThousands + ", " + millions + ")", 300);
		}
		
		return true;
	}

	function doCounter()
	{		    
		//is movie ready?
		if (null == counterMovie.SetCounter)
		{
			//try again soon
			setTimeout("doCounter()", 500);
			return;
		}


        //choose ajax method
		var method;
		if (isTotalMovie)
			method = "GetTotalSessionsCount";
		else
			method = "GetSessionsCount";
		
		
		//do we have a position we are remembering?
		var c = document.cookie;
		if (c.indexOf(method) != -1)
		{
			var start = c.indexOf(method) + method.length + 1;
			var end	= c.indexOf(';', start);

			if (end == -1)
				end = c.length;
				
			var val = c.substring(start, end);

			setCounter(val, true);
		}			
		
		
		//call webservice to get count of current sessions
		var request = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("MSXML2.XMLHTTP.3.0");
		
		var soapDoc = '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">' + 
						'<soap:Body>' + 
							'<' + method + ' xmlns="http://www.tutor.com/" />' +
						'</soap:Body>' + 
					  '</soap:Envelope>';
		
		request.open("POST", "/counter/counter.asmx", true);
		request.setRequestHeader("Content-Type", "text/xml");
 
		request.onreadystatechange = function()
		{				
			if (request.readyState == 4) 
			{	
				var nextOne	= Math.floor(Math.random() * 1000) + 5000;
				
				if (request.status == 200)
				{	
					var num = getNumberFromResponse(request.responseText);
					
					//if the movie hasn't loaded yet, try again quickly
					if (setCounter(num) == false)
					{
						nextOne = 500;
					}
					else
					{
						//remember it
						document.cookie = method + '=' + num + '; path=/';
					}
				}
				
				//do it again in 5 secs
				setTimeout("doCounter()", nextOne);
			}
		}
		
		request.send(soapDoc);
	}
	
	function getNumberFromResponse(response)
	{
		//code for IE
		if (window.ActiveXObject)
		{
			var doc = new ActiveXObject("Microsoft.XMLDOM");
			doc.async = "false";
			doc.loadXML(response);
		}
		// code for Mozilla, Firefox, Opera, etc.
		else
		{
			var parser = new DOMParser();
			var doc = parser.parseFromString(response, "text/xml");
		}
		
		return doc.documentElement.childNodes[0].childNodes[0].childNodes[0].childNodes[0].nodeValue;
	}
	
	
    function loadCounterMovie(divId, isTotal)
    {
        //bug somewhere in flash9 and IE regarding reloading movie from cache that uses ExternalCallback
        // this bug is fixed by 9.0.115.0, but there at least up to 9.0.47.0 (didn't test intermediaries)
        // so... putting random param from getTime() causes IE to re-get the movie each page load, which is ok, especially since counter is just on the homepage
        var d = new Date();
        var randnum = d.getTime();
        
	    var html =
			'<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="https://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" id="counterMovie" width="120" height="20" align="middle">' +
				'<param name="allowScriptAccess" value="always" /><param name="movie" value="/counter/counter.swf?r=' + randnum + '" /><param name="quality" value="high" />' + 
				'<embed src="/counter/counter.swf" quality="high" name="counterMovie" width="120" height="20" align="middle" allowScriptAccess="always" type="application/x-shockwave-flash" pluginspage="https://www.macromedia.com/go/getflashplayer" menu="false"/>' +
			'</object>'
			;			

	    var d = document.getElementById(divId);
	    d.innerHTML = html;
		
		//set global vars
		isTotalMovie = isTotal;
		counterMovie = (window.ActiveXObject) ? document.getElementById('counterMovie') : document['counterMovie'];
		
		setTimeout("doCounter()", 50);
	}
	
	function cleanUpCounterObjects()
	{	    
		var objects = document.getElementsByTagName("object");
		
		for (var i=0; i < objects.length; i++)
		{
			for (var x in objects[i])
			{
				if (typeof objects[i][x] == 'function')
					objects[i][x] = null;
			}
		}
	}	
	
	beforeUnloadCounterObjects = function()
	{
		//fix for memory bug with flash 9 and IE
		__flash_unloadHandler = function(){};
		__flash_savedUnloadHandler = function(){};
		
		window.attachEvent( "onunload", cleanUpCounterObjects );
	}
	
	if (window.attachEvent)
		window.attachEvent( "onbeforeunload", beforeUnloadCounterObjects);
