// Initialise the script

// Constants
var AjaxPostToURL = "/default.aspx";
var AjaxOpenTabFromURL = "/default.aspx";

// Public variables
var AjaxHandler;
var AjaxContentPane;
var AjaxCurrentTab;

var db = undefined;	
db = document.createElement("textarea");
db.rows = "20";
db.cols = "80";



var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();

var ajaxSupported = false;

if (BrowserDetect.browser == 'Explorer') 
{
	ajaxSupported = true;
}

function __doPostBack(eventTarget, eventArgument) {
	
	if (AjaxHandler == undefined) 
	{
	    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
			theForm.__EVENTTARGET.value = eventTarget;
			theForm.__EVENTARGUMENT.value = eventArgument;
			theForm.submit();
	    }
	}
	else if ( eventTarget == 'dnn$dnnLOGIN$cmdLogin')
	{
		theForm.__EVENTTARGET.value = eventTarget;
		theForm.__EVENTARGUMENT.value = eventArgument;
		theForm.submit();
	}
	else 
	{
		theForm.__EVENTTARGET.value = eventTarget;
		theForm.__EVENTARGUMENT.value = eventArgument;
		AjaxHandler.Refresh(theForm);
	}
}


function ArtroAjaxHandler(ContentPane) 
{
	// Initialise the object
	// Public methods
	//$(ContentPane).parentNode.appendChild(db);
	
	function formSubmit() 
	{
	    alert("Poging om form te posten gedetecteerd");
	    AjaxHandler.Refresh();
	    return false;
	}
	
	// Properties
	AjaxContentPane = $(ContentPane);
	this.Form = theForm;
	this.ContentPane = ContentPane;
	
	AjaxContentPane.parentNode.appendChild(db);
	db.style.display = "none";
	
	iniWaiter();
	// Methods
	if (ajaxSupported) 
	{
		this.Refresh = function()
		{
			try 
			{
				showWaiter();
				var fCache = Form.serialize(AjaxHandler.Form);
				AjaxContentPane.innerHTML = '';
				var url; 
				if (AjaxCurrentTab == undefined) 
				{
					url = AjaxHandler.Form.Action;
				}
				else
				{
					url = AjaxPostToURL + "?tabid=" + AjaxCurrentTab;
				}
				onFinishPreloadPastIntoContentPane = '';
				this.Preload(url, true, fCache);
				dbDebug('---------------------------------\nrefreshing page\n---------------------------------\nAction: ' + url);
				new Ajax.Request(url, {asynchronous:true, 
								     onComplete: function(transport) {
										try 
										{
											
											c = findDivSection(transport.responseText, AjaxContentPane.id);
											if (WaiterContainer.style.display != 'none') 
											{
												onFinishPreloadPastIntoContentPane = c;
											}
											else 
											{
												AjaxContentPane.innerHTML = c;
											}
										}
										catch(err) 
										{
											alert(err.message + "\n\nstart: " + start + "\n\n" + c);
										}
									 },
									 parameters:fCache});
			}
			catch (err)
			{
				alert(err.message);
			}
		};
		
		this.FollowMenuLink = function(Link)
		{
			AjaxCurrentTab = Link;
			AjaxContentPane.innerHTML = '';
			url = AjaxOpenTabFromURL + "?tabid=" + AjaxCurrentTab;
			onFinishPreloadPastIntoContentPane = '';
			this.Preload(url);
			dbDebug('---------------------------------\nFollowing link\n---------------------------------\nAction: ' + url);
			new Ajax.Request(url, {asynchronous:true, 
								 onComplete: function(transport) {
									try 
									{
										c = findDivSection(transport.responseText, AjaxContentPane.id);
										
										if (WaiterContainer.style.display != 'none') 
										{
											onFinishPreloadPastIntoContentPane = c;
										}
										else 
										{
											AjaxContentPane.innerHTML = c;
										}
										//alert(c);
									}
									catch(err) 
									{
										alert(err.message + "\n\nstartA: " + startA + "\n\nstart: " + start + "\n\neind: " + eind + "\n\n" + c);
									}
								 }});
		};
		
		this.OpenCustomLink = function(url)
		{
			new Ajax.Request(url, {asynchronous:true, 
								 onComplete: function(transport) {
									try 
									{
										c = findDivSection(transport.responseText, AjaxContentPane.id);
										AjaxContentPane.innerHTML = c;
										AjaxContentPane.style.visibility = "visible";
										executeJavaScript(c);
									}
									catch(err) 
									{
										alert(err.message + "\n\nstartA: " + startA + "\n\nstart: " + start + "\n\neind: " + eind + "\n\n" + c);
									}
								 }});
		};
		
		this.Preload = function(url, submitform, ffform)
		{
			if (submitform) {
				dbDebug('---------------------------------\nPreloading page (with form post)\n---------------------------------\nAction: ' + url);
				
				new Ajax.Request(url, {asynchronous:true, 
									 onComplete: function(transport) {
										try 
										{
											c = findDivSection(transport.responseText, AjaxContentPane.id);
											var hDiv = document.createElement('div');
											preloadImages(c);
										}
										catch(err) 
										{
											alert(err.message + "\n\nstartA: " + startA + "\n\nstart: " + start + "\n\neind: " + eind + "\n\n" + c);
										}
									 },
									 parameters:ffform});
			}
			else 
			{
				dbDebug('---------------------------------\nPreloading page\n---------------------------------\nAction: ' + url);
				new Ajax.Request(url, {asynchronous:true, 
									 onComplete: function(transport) {
										try 
										{
											c = findDivSection(transport.responseText, AjaxContentPane.id);
											var hDiv = document.createElement('div');
											preloadImages(c);
										}
										catch(err) 
										{
											alert(err.message + "\n\nstartA: " + startA + "\n\nstart: " + start + "\n\neind: " + eind + "\n\n" + c);
										}
									 }});
			}
		};
		
		
	}
	else 
	{
		this.Refresh = function() 
		{
			theForm.submit();
		}
		this.FollowMenuLink = function(Link)
		{
			window.location = AjaxOpenTabFromURL + "?tabid=" + Link;
		}
		this.OpenCustomLink = function(url)
		{
			window.location = url;
		}
	}
}



function findDivSection(html, id) 
{
	var start = html.indexOf(">", html.indexOf("<div id=\"" + id + "\"")) + 1;
	
	var strRet;
	
	var divCount = 0;
	var nextDiv;
	for (var a = start + 1; a < html.length; a++) 
	{
		nextDiv = html.indexOf("<div", a);
		
		if (html.indexOf("</div", a) > nextDiv) 
		{
			a = nextDiv + 1;
			divCount++;
		}
		else 
		{
			if (divCount == 0) 
			{
				//alert("Start: " + start + "\nEinde: " + html.indexOf("</div", a) + "\nDivCount: " + divCount + "\n\n" + html.substring(start, html.indexOf("</div", a)));
				strRet = html.substring(start, html.indexOf("</div", a));
				
				return strRet;
			}
			else
			{
				
				divCount--;
				a = html.indexOf("</div", a);
			}
		}
	}
}

function executeJavaScript(html) 
{
	var prevstart = -1;
	var doLoop = true;
	var start = 0;
	var end = 0;
	var q = 0;
	
	
	
	if (html.indexOf("<script type=\"text/javascript\">") > -1)
	{
		while (doLoop)
		{
			start = html.indexOf("<script type=\"text/javascript\">", end) + 31;
			
			end = html.indexOf("</script>", start) - 1;
			
			if (start == -1) 
			{
				doLoop = false;
			}
			prevstart = start;

			//alert(js);
			var js = html.substring(start, end)
			
			//var jsA = js.split("\n");
			
			
			
			var execOnComplete = "";
			
				try 
				{
					var ok = false;
					//db.value += jsA + "\n";
					//alert(jsA[aa]);
					var exec = "";
					eval(js);
					
					if (exec != "") 
					{
						execOnComplete += exec + "\n";
					}
				} 
				catch(err)
				{	
					alert(err.message + "\n\n" + js);
				}
			
			var jsA = execOnComplete.split("\n");
			
			for (var aa=0; aa < jsA.length; aa++)
			{
				setTimeout(jsA[aa], q + aa * 250);
			}
			
			if (start - 31 == html.lastIndexOf("<script type=\"text/javascript\">"))
			{
				//alert(html.lastIndexOf("<script type=\"text/javascript\">"));
				doLoop = false;
			}
			q+=1000;
		}
	}
	
}

var waiter;

function showWaiter() 
{
	var width = getSize()['width'];
	var height = getSize()['height'];
	waiter = document.createElement('div');
	waiter.style.horizontalAlign = 'middle';
	waiter.style.textAlign = 'center';
	var img = document.createElement('img');
	img.src = "/spinner.gif";
	waiter.appendChild(img);
	waiter.style.height = height;
	waiter.style.width = width;
	waiter.style.position = 'absolute';
	document.body.appendChild(waiter);
}

function hideWaiter()
{
	document.body.removeChild(waiter);
	
}

function getSize() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return {'width': myWidth, 'height': myHeight}

}

var totalImagesLoaded = 0;
var imagesToPreload = new Array();
var currentImage = 0;
var divWaiter = document.createElement('div');
var divInnerWaiter = document.createElement('div');
var onFinishPreloadPastIntoContentPane = ''; 
var WaiterContainer = document.createElement('div');

function preloadImages(html) 
{
	var prevstart = -1;
	var doLoop = true;
	var start = 0;
	var end = 0;
	
	var q = 0;
	
	imagesToPreload = new Array();
	
	var a = 0;
	
	if (html.indexOf("<img") > -1)
	{
		while (doLoop)
		{
			start = html.indexOf("<img", end) + 4;
			
			var srcStart = html.indexOf("src=\"", start) + 5;
			var srcEnd = html.indexOf("\"", srcStart);
			
			end = html.indexOf(">", start) - 1;
			
			if (html.indexOf("<img", end) == -1) 
			{
				doLoop = false;
			}
			prevstart = start;
			
			imagesToPreload[imagesToPreload.length] = html.substring(srcStart, srcEnd);
			a++;
			if (a > html.length)
				doLoop = false;
		}
	}
	//alert(imagesToPreload.length);
	if (imagesToPreload.length > 0) {
		showWaiter();
		currentImage = 0;
		totalImagesLoaded = 0;
		db.value += 'there are ' + imagesToPreload.length + ' images to load\n'; 
		
		setTimeout("preloadImagesDo()", 0);
	}
	else 
	{
		if (onFinishPreloadPastIntoContentPane != '') {
			AjaxContentPane.innerHTML = onFinishPreloadPastIntoContentPane;
		}
		AjaxContentPane.style.visibility = 'visible';
	}
	
	
}
function dbDebug(tekst)
{
	db.value += tekst + '\n';
}
function preloadImagesDo()
{
	var img = new Image();
	img.src = imagesToPreload[currentImage];
	db.value += currentImage + ' requested\n'; 
	img.id = currentImage;
	if (img.complete) 
	{
		setInnerWaiter(imagesToPreload.length, totalImagesLoaded); 
		db.value += currentImage + ' allready loaded (' + totalImagesLoaded + '/' + parseInt(imagesToPreload.length - 1) + ')\n';
		totalImagesLoaded++;
		if (totalImagesLoaded >= imagesToPreload.length - 1) 
		{ 	
			hideWaiter(); 
		} 
	}
	
	img.onload = new Function("setInnerWaiter(imagesToPreload.length, totalImagesLoaded); db.value += this.id + ' loaded (' + totalImagesLoaded + '/' + parseInt(imagesToPreload.length - 1) + ')\\n'; totalImagesLoaded++; if (totalImagesLoaded >= imagesToPreload.length - 1) { hideWaiter(); } ");
	img.onerror = new Function("setInnerWaiter(imagesToPreload.length, totalImagesLoaded); db.value += this.id + ' errored (' + totalImagesLoaded + '/' + parseInt(imagesToPreload.length - 1) + ')\\n'; totalImagesLoaded++; if (totalImagesLoaded >= imagesToPreload.length - 1) { hideWaiter(); } ");
	img.onabort = new Function("setInnerWaiter(imagesToPreload.length, totalImagesLoaded); db.value += this.id + ' aborted (' + totalImagesLoaded + '/' + parseInt(imagesToPreload.length - 1) + ')\\n'; totalImagesLoaded++; if (totalImagesLoaded >= imagesToPreload.length - 1) { hideWaiter(); } ");
	
	img.style.display = 'none';
	document.body.appendChild(img);
	currentImage++;
	//ert(currentImage);
	if (currentImage < imagesToPreload.length) 
	{
		setTimeout("preloadImagesDo()", 0);
	}
	
}
function iniWaiter()
{
	//WaiterContainer.style.float = 'left';
    WaiterContainer.style.position = 'absolute';
	WaiterContainer.style.top = '3px';
	//WaiterContainer.style.left = '5px';
	WaiterContainer.style.display = 'none';
	WaiterContainer.style.padding = '6px 0 0 12px';
	
	var imgSpinner = new Image();
	imgSpinner.src = '/images/logo.gif';
	WaiterContainer.appendChild(imgSpinner);
	
	//WaiterContainer.appendChild(document.createElement('br'));
	//WaiterContainer.appendChild(document.createElement('br'));
	
	WaiterContainer.style.background = '#fff';
	WaiterContainer.style.border = 'none';
				
	divWaiter.style.width = "158px";
	divWaiter.style.height = "4px";
	divWaiter.style.overflow = 'hidden';
	divWaiter.style.background = '#FFF';
	divWaiter.style.border = '1px solid #CCC';
	
	divInnerWaiter.style.background = 'black';
	divInnerWaiter.style.width = '1px';
	divInnerWaiter.style.overflow = 'hidden';
	

	//var h = document.createElement('h6');
	//h.innerHTML = 'Bezig met laden';
	//WaiterContainer.appendChild(h);
	
	divWaiter.appendChild(divInnerWaiter);
	WaiterContainer.appendChild(divWaiter);
	
	$('aLogo').parentNode.insertBefore(WaiterContainer,$('aLogo'));


}
function showWaiter()
{
	setInnerWaiter(10, 0)
	WaiterContainer.style.display = '';
}
function hideWaiter()
{
	WaiterContainer.style.display = 'none';
	if (onFinishPreloadPastIntoContentPane != '') {
		dbDebug('----------------------------------------------\n' + onFinishPreloadPastIntoContentPane + '----------------------------------------------\n');
		AjaxContentPane.innerHTML = onFinishPreloadPastIntoContentPane;
	}
	else
	{
		dbDebug('preloading done with an empty contentpane');
	}
	AjaxContentPane.style.visibility = 'visible';
}
function setInnerWaiter(max, value)
{
	var w = value / max * parseInt(divWaiter.style.width);
	//alert(w);
	
	divInnerWaiter.style.width = w;
}