var Desk = {
	widgetsLoading: 0,
	widgetSerial: 0,
	highestLevel: 9,
	widgets: [],
	storedPrefs: {},
	sitePrefs: {},
	initialized: false,
	installDir: '/tux-desk',
	
	loadingMessageOn: false,
	
	positionMode: 'fixed',
	debugMode: false,
	controlDisplay: 'none',
	preloadImages: true,
	
	widgetDisplay: '',
	showLoadingMessage: true,
	widgetDimmer: false,
	fadedBackground: false,
	
	widgetContainer: function(serialNumber) {
		var winHeight = window.innerHeight || document.body.offsetHeight;
		var winWidth = window.innerWidth || document.body.offsetWidth;
		
		var newWidget = document.createElement('div');
		newWidget.style.position = Desk.positionMode;
		newWidget.style.top = (Math.round((Math.random()*(winHeight - 221))+1)) + "px";
		newWidget.style.left = (Math.round((Math.random()*(winWidth - 221))+1)) + "px";
		newWidget.style.display = "none";
		newWidget.setAttribute('id', 'widget'+serialNumber);
		newWidget.setAttribute('class', 'tuxDeskObject tdWidget');
		newWidget.onmousedown = function () {
			Desk.widgetFocus(this);
		};
		newWidget.style.zIndex = ++Desk.highestLevel;
		
		var contentHolder = document.createElement('div');
		newWidget.appendChild(contentHolder);
		contentHolder.style.position = "absolute";
		contentHolder.style.top = "0px";
		contentHolder.style.left = "0px";
		contentHolder.setAttribute('id', 'widgetContent'+serialNumber);
		contentHolder.setAttribute('rel', 'open');
		
		var theControls = document.createElement('div');
		newWidget.appendChild(theControls);
		theControls.style.position = "absolute";
		theControls.style.top = "-20px";
		theControls.style.left = "-20px";
		theControls.style.width = "150px";
		theControls.setAttribute('id', 'widgetControls'+serialNumber);
		theControls.innerHTML = "&nbsp;<span id=\"widgetControlsInner"+serialNumber+"\" class=\"widgetControls\"><a href=\"#\" onclick=\"Desk.collapseWidget('"+serialNumber+"');return false;\" title=\"Collapse or restore widget\"><img src=\""+Desk.installDir+"/collapse.png\" alt=\"Collapse or Restore Widget\" style=\"border:none;\" /></a><a href=\"#\"  onclick=\"Desk.closeWidget('"+serialNumber+"');return false;\" title=\"Close widget\"><img src=\""+Desk.installDir+"/close.png\" alt=\"Close Widget\" style=\"border:none;\" /></a><img src=\""+Desk.installDir+"/drag.png\" alt=\"Drag Widget\" title=\"Move the widget\" style=\"cursor:move;\" id=\"draggerFor"+serialNumber+"\"/></span>";
		
		document.getElementsByTagName('body')[0].appendChild(newWidget);
		
		Drag.init($('draggerFor'+serialNumber), newWidget, null, null, 0);
		
		$('widgetControlsInner'+serialNumber).style.display = Desk.controlDisplay;
		
		return {widgetObject: $('widget'+serialNumber), content: $('widgetContent'+serialNumber)};
	},
	
	makeWidget: function(originalRequest, json) {
		var widgetResult = json;		
		var widgetSerial = widgetResult.serial;
		var widgetObject = Desk.widgets[widgetSerial];
		
		if (widgetResult.info) {
			widgetObject.info = widgetResult.info;
		} else {
			widgetObject.info = {url:widgetResult.url, prefs:false};
		}
		
		if (widgetResult.about) {
			widgetObject.info.about = widgetResult.about;
		}
		
		var theWidget = Desk.widgetContainer(widgetSerial);
		theWidget.content.innerHTML = widgetResult.html;
		
		var draggableItems = new Array();
		
		var els = theWidget.content.getElementsByTagName('*');
		
		for (var i=0; i < els.length; i++) {
			Desk.draggability(els[i], theWidget.widgetObject);
		}
		
		if (widgetResult.css) {
			var styler = document.createElement('style');
			styler.setAttribute('type', 'text/css');
			styler.appendChild(document.createTextNode(widgetResult.css));
			
			var theHead = document.getElementsByTagName('head')[0];
			theHead.appendChild(styler);
			
			widgetObject.styleObject = styler;
		}
		
		if (widgetResult.js) {
			assignJS = function(widget) {
				widgetObject.script = eval('({' + widgetResult.js + '})');
			};
			widgetObject.globalize(widgetObject);
			assignJS(widgetObject.widgetFunctions);
			
			if (widgetObject.info) {
				if (widgetObject.info.prefs) {
					if (Desk.sitePrefs[widgetObject.url]) {
						for (pref in Desk.sitePrefs[widgetObject.url]) {
							if (Desk.sitePrefs[widgetObject.url][pref].isPref) {
								widgetObject.widgetFunctions.setPref(pref, Desk.sitePrefs[widgetObject.url][pref].value);
							}
						}
					}
					
					if (Desk.storedPrefs[widgetObject.url]) {
						widgetObject.info.prefs = Desk.storedPrefs[widgetObject.url].toJSON().evalJSON(true);
					}
				}
			}
			
			try {
				widgetObject.script.onLoad();
			}
			catch(err) {
				if (Desk.debugMode) {
					window.alert(err);
				}
			}
		}
		
		Desk.widgetAppear(widgetSerial);
	},
	
	makeImageWidget: function(imageWidget) {
		var widgetSerial = imageWidget.serial;
		var widgetObject = imageWidget;
		
		var theWidget = Desk.widgetContainer(widgetSerial);
		
		var theImage = document.createElement('img');
		theImage.setAttribute('src', widgetObject.url);
		theImage.setAttribute('alt', 'Image Widget');
		
		theWidget.content.appendChild(theImage);
		
		theWidget.widgetObject.style.cursor = "move";
		Drag.init(theWidget.widgetObject, theWidget.widgetObject, null, null, 0);
		
		Desk.widgetAppear(widgetSerial);
	},
	
	widgetAppear: function(widgetSerial){
		var widgetFader = new fx.Opacity($('widget'+widgetSerial), {duration:500});
		
		widgetFader.setOpacity(0);
		$('widget'+widgetSerial).style.display = Desk.widgetDisplay;
		widgetFader.custom(0, 1);
		
		Desk.widgetsLoading--;
		Desk.statusCheck();
	},
	
	showControls: function() {
		if (Desk.controlDisplay == 'none') {
			var allSpans = document.getElementsByTagName('span');
			
			for (var i=0; i < allSpans.length; i++) {
				if (allSpans[i].className.indexOf('widgetControls') > -1) {
					allSpans[i].style.display = "";
				}
			}
			
			Desk.controlDisplay = '';
		}
	},
	
	hideControls: function() {
		if (Desk.controlDisplay == '') {
			var allSpans = document.getElementsByTagName('span');
			
			for (var i=0; i < allSpans.length; i++) {
				if (allSpans[i].className.indexOf('widgetControls') > -1) {
					allSpans[i].style.display = "none";
				}
			}
			
			Desk.controlDisplay = 'none';
		}
	},
	
	toggleControls: function() {
		if (Desk.controlDisplay == '') {
			Desk.hideControls();
		} else {
			Desk.showControls();
		}
	},
	
	collapseWidget: function(widgetID) {
		var theWidget = $('widgetContent'+widgetID);
		var widgetFader = new fx.Opacity(theWidget, {duration:500});
		var theState = theWidget.getAttribute('rel');
		if (theState == 'open') {
			widgetFader.custom(1, 0);
			setTimeout("$('widgetContent"+widgetID+"').style.display = \"none\";", 550);
			theWidget.setAttribute('rel', 'closed');
		} else if (theState == 'closed') {
			widgetFader.setOpacity(0);
			theWidget.style.display = "";
			widgetFader.custom(0, 1);
			theWidget.setAttribute('rel', 'open');
		}
	},
	
	closeWidget: function(widgetID) {
		var theWidget = $('widget'+widgetID);
		var widgetFader = new fx.Opacity(theWidget, {duration:500});
		widgetFader.custom(1, 0);
		setTimeout("Desk.cleanupWidget("+widgetID+");", 550);
	},
	
	cleanupWidget: function(widgetID) {
		var theWidget = $('widget'+widgetID);
		var widgetObject = Desk.widgets[widgetID];
		
		document.getElementsByTagName('body')[0].removeChild(theWidget);
		
		if (widgetObject.styleObject) {
			document.getElementsByTagName('head')[0].removeChild(widgetObject.styleObject);
		}
		
		Desk.widgets[widgetID] = null;
	},
	
	makeDialog: function(theTitle, theButtons){
		var winWidth = window.innerWidth || document.body.offsetWidth;
		var dialog = document.createElement('div');
		dialog.style.width = "397px";
		dialog.style.position = "fixed";
		dialog.style.left = ((winWidth / 2) - 199) + "px";
		dialog.style.top = "70px";
		dialog.style.display = "none";
		dialog.setAttribute('id', 'widgetDialog');
		dialog.setAttribute('class', 'tuxDeskObject');
		dialog.style.zIndex = (205 + Desk.highestLevel);
		
		var header = document.createElement('div');
		header.style.backgroundImage = "url('"+Desk.installDir+"/pref-top.png')";
		header.style.height = "74px";
		header.style.fontFamily = "'Georgia', serif";
		header.style.fontSize = "32pt";
		header.style.color = "#fff";
		header.style.paddingLeft = "15px";
		header.style.paddingTop = "13px";
		header.innerHTML = theTitle;
		
		dialog.appendChild(header);
		
		var mainBody = document.createElement('div');
		mainBody.style.backgroundImage = "url('"+Desk.installDir+"/pref-fill.png')";
		mainBody.style.backgroundRepeat = "repeat-y";
		mainBody.setAttribute('id', 'widgetDialogContent');
		mainBody.style.color = "#fff";
		mainBody.style.fontSize = "12pt";
		mainBody.style.fontFamily = "'Georgia', serif";
		mainBody.style.paddingLeft = "15px";
		mainBody.style.paddingRight = "25px";
		mainBody.style.paddingBottom = "25px";
		
		dialog.appendChild(mainBody);
		
		var footer = document.createElement('div');
		footer.style.backgroundImage = "url('"+Desk.installDir+"/pref-bottom.png')";
		footer.style.height = "65px";
		footer.style.position = "relative";
		footer.style.paddingRight = "20px";

		for (var i=0; i < theButtons.length; i++) {
			thisLink = Desk.createButton(theButtons[i].title, theButtons[i].onclick, 'float');
			
			footer.appendChild(thisLink);
		}
		
		dialog.appendChild(footer);
		
		document.getElementsByTagName('body')[0].appendChild(dialog);
		
		return {object: dialog, content: mainBody};
	},
	
	openAboutWindow: function(widgetID) {
		Desk.dimScreen();
		var widget = Desk.widgets[widgetID].info;
		var widgetContent = '';
		var aboutWin = Desk.makeDialog('About', [{title:'Close', onclick:function(){Desk.closeDialog();return false;}}]);
		
		widgetContent = "<div><div><strong>" + widget.name + "</strong></div><div style=\"margin-bottom:10px;\"><cite style=\"font-size:10pt;\">" + widget.author + "</cite></div><div>";
		
		if (widget.about) {
			widgetContent += widget.about;
		} else {
			widgetContent += "This widget has no About dialog.";
		}
		
		widgetContent += "</div></div>";
		
		aboutWin.content.innerHTML = widgetContent;
		aboutWin.object.style.display = "";
	},
	
	openPrefWindow: function(widgetID) {
		Desk.dimScreen();
		var widget = Desk.widgets[widgetID].info;
		var widgetContent = '';
		var thePrefs = Desk.makeDialog('Options', [{title:'Save', onclick:function(){Desk.savePrefs(widgetID);return false;}}, {title:'Cancel', onclick:function(){Desk.closeDialog();return false;}}]);
		
		if (widget.prefs != false) {
			widgetContent = "<div><div><strong>" + widget.name + "</strong></div><div style=\"margin-bottom:10px;\"><cite style=\"font-size:10pt;\">" + widget.author + "</cite></div><form action=\"#\" method=\"get\" onreset=\"Desk.closeDialog();return false;\" onsubmit=\"Desk.savePrefs(" + widgetID + ");return false;\"><table style=\"width:350px\">";
			for (preference in widget.prefs) {
				if (widget.prefs[preference].type) {
					widgetContent += "<tr><td style=\"width:120px;\">"+widget.prefs[preference].title + ":</td><td style=\"width:230px;\">";
					switch (widget.prefs[preference].type) {
						case 'string':
							widgetContent += "<input type=\"text\" id=\"pref-" + preference + "\" value=\"" + widget.prefs[preference].value + "\" style=\"width:230px;\" /><br />";
							break;
						case 'password':
							widgetContent += "<input type=\"password\" id=\"pref-" + preference + "\" value=\"" + widget.prefs[preference].value + "\" style=\"width:230px;\" /><br />";
							break;
						case 'select':
							widgetContent += "<select id=\"pref-" + preference + "\" style=\"width:230px;\">";
							for (var i=0; i < widget.prefs[preference].values.length; i++) {
								thisVal = widget.prefs[preference].values[i];
								widgetContent += "<option value=\"" + thisVal + "\"";
								if (widget.prefs[preference].value == thisVal) {
									widgetContent += " selected=\"selected\"";
								}
								widgetContent += ">" + thisVal + "</option>";
							}
							widgetContent += "</select><br />";
							break;
					}
					widgetContent += "</tr>";
				}
			}
			widgetContent += "</table><p style=\"text-align:right;padding-right:20px;\"><label><input type=\"checkbox\" value=\"save\" id=\"td-saveDefaults\" /> Set as Defaults</label></p></form></div>";
		} else {
			widgetContent = "<div>This widget has no preferences.</div>";
		}
		
		thePrefs.content.innerHTML = widgetContent;
		thePrefs.object.style.display = "";
	},
	
	closeDialog: function(){
		if ($('widgetDialog')) {
			document.getElementsByTagName('body')[0].removeChild($('widgetDialog'));
			if (Desk.widgetDimmer == false) {
				Desk.undimScreen();
			}
		}
	},
	
	savePrefs: function(widgetID){
		if ($('widgetDialog')) {
			var widgetObject = Desk.widgets[widgetID];
			var widget = widgetObject.info;
			
			for (preference in widget.prefs) {
				if ($('pref-'+preference)) {
					widget.prefs[preference].value = $F('pref-'+preference);
				}
			}
			
			if ($F('td-saveDefaults') == 'save') {
				Desk.storedPrefs[widgetObject.url] = widget.prefs;
				Desk.storeSetting('tuxDeskPrefs', Desk.storedPrefs.toJSON(), 3652);
			}
			
			try {
				var updateFunc = function(){
					widgetObject.script.prefsUpdated();
				}.bind(widgetObject);
				
				updateFunc();
			}
			catch(err) {
				if (Desk.debugMode) {
					window.alert(err);
				}
			}
			
			Desk.closeDialog();
		}
	},
	
	widgetFocus: function(theWidget) {
		if (theWidget.style.zIndex != Desk.highestLevel) {
			theWidget.style.zIndex = ++Desk.highestLevel;
		}
	},
	
	draggability: function(theElement, theWidget) {
		if (theElement.className.indexOf('dragger') > -1) {
			theElement.style.cursor = "move";
			Drag.init(theElement, theWidget, null, null, 0);
		}
	},
	
	statusCheck: function(){
		setTimeout(Desk.updateStatus, 200);
	},
	
	updateStatus: function(){
		if (Desk.widgetsLoading > 0) {
			if (!Desk.loadingMessageOn && Desk.showLoadingMessage) {
				var winHeight = window.innerHeight || document.body.offsetHeight;
				var winWidth = window.innerWidth || document.body.offsetWidth;
				var message = document.createElement('div');
				message.style.position = "fixed";
				message.style.height = "100px";
				message.style.width = "200px";
				message.style.backgroundImage = "url('"+Desk.installDir+"/status.png')";
				message.setAttribute('id', 'tuxDeskStatusMessage');
				message.setAttribute('class', 'tuxDeskObject');
				message.style.zIndex = "100";
				message.style.color = "#fff";
				message.style.fontFamily = "'Georgia', serif";
				message.style.display = Desk.widgetDisplay;
				
				message.style.top = ((winHeight / 2) - 50) + 'px';
				message.style.left = ((winWidth / 2) - 100) + 'px';
				
				var messageText = document.createElement('span');
				messageText.innerHTML = "loading...";
				messageText.style.position = "absolute";
				messageText.style.top = "45px";
				messageText.style.left = "90px";
				
				var widgetFader = new fx.Opacity(message, {duration:500});
		
				widgetFader.setOpacity(0);
				
				message.appendChild(messageText);
				
				document.getElementsByTagName('body')[0].appendChild(message);
				
				widgetFader.custom(0, 1);
				
				Desk.loadingMessageOn = true;
			}
		} else {
			if (Desk.loadingMessageOn) {
				if ($('tuxDeskStatusMessage')) {
					var widgetFader = new fx.Opacity($('tuxDeskStatusMessage'), {duration:500});
					widgetFader.custom(1, 0);
					setTimeout("document.getElementsByTagName('body')[0].removeChild($('tuxDeskStatusMessage'));", 550);
				}
				Desk.loadingMessageOn = false;
			}
		}
	},
	
	makeControlPanel: function(quickWidgets){
		Desk.initialize();
		
		Desk.quickWidgets = quickWidgets;
		
		var cpanel = document.createElement('div');
		cpanel.setAttribute('id', 'tuxDeskControlPanel');
		cpanel.setAttribute('class', 'tuxDeskObject');
		
		cpanel.style.position = 'fixed';
		cpanel.style.top = '0px';
		cpanel.style.right = '0px';
		cpanel.style.width = '0px';
		cpanel.style.height = '250px';
		cpanel.style.backgroundImage = "url('"+Desk.installDir+"/panel.png')";
		cpanel.style.zIndex = '100';
		
		var cpbutton = document.createElement('img');
		cpanel.appendChild(cpbutton);
		
		cpbutton.onclick = function(){
			Desk.toggleControlPanel();
			return false;
		};
		cpbutton.style.cursor = 'pointer';
		cpbutton.setAttribute('src', Desk.installDir+'/control-panel-button.png');
		cpbutton.style.position = 'relative';
		cpbutton.style.right = '27px';
		
		
		var optionHolder = document.createElement('p');
		optionHolder.style.textAlign = 'center';
		optionHolder.style.position = 'absolute';
		optionHolder.style.top = '0px';
		optionHolder.style.left = '0px';
		optionHolder.style.width = '200px';
		
		var thisLink = Desk.createButton('Add Widget', function(){Desk.addWidget();return false;}, 'center');
		optionHolder.appendChild(thisLink);
		
		var thisLink = Desk.createButton('Controls', function(){Desk.toggleControls();return false;}, 'center');
		optionHolder.appendChild(thisLink);
		
		var thisLink = Desk.createButton('Show/Hide', function(){Desk.toggleWidgetDisplay();return false;}, 'center');
		optionHolder.appendChild(thisLink);
		
		var thisLink = Desk.createButton('Close', function(){Desk.closeControlPanel();return false;}, 'center');
		optionHolder.appendChild(thisLink);
		
		var thisLink = Desk.createButton('About...', function(){Desk.aboutTuxDesk();return false;}, 'center');
		thisLink.style.marginTop = '18px';
		optionHolder.appendChild(thisLink);
		
		cpanel.appendChild(optionHolder);
		
		document.getElementsByTagName('body')[0].appendChild(cpanel);
		
		Desk.controlPanel = cpanel;
	},
	
	openControlPanel: function(){
		Desk.controlPanel.style.width = '200px';
	},
	
	closeControlPanel: function(){
		Desk.controlPanel.style.width = '0px';
	},
	
	toggleControlPanel: function(){
		if (Desk.controlPanel.style.width == '200px') {
			Desk.closeControlPanel();
		} else {
			Desk.openControlPanel();
		}
	},
	
	addWidget: function(){
		Desk.dimScreen();
		var addWidget = Desk.makeDialog('Add a Widget', [{title:'Add', onclick:function(){Desk.completeImageAdd();return false;}}, {title:'Cancel', onclick:function(){Desk.closeDialog();return false;}}]);
		
		dContent  = '<div>';
		
		if (Desk.quickWidgets) {
			dContent += '<div><strong>Choose a Widget:</strong></div>';
			dContent += '<ul>';
			
			for (var i=0; i < Desk.quickWidgets.length; i++) {
				dContent += '<li><a href="#" onclick="Desk.closeDialog();new Desk.Widget(\''+Desk.quickWidgets[i].url+'\');return false;">'+Desk.quickWidgets[i].name+'</a></li>';
			}
			
			dContent += '</ul><div><strong>Or... open your own widget:</strong></div><p />';
		}
		
		dContent += '<form name="tdAddWidgetForm" onsubmit="Desk.completeImageAdd();return false;"><div><strong>Type of Widget:</strong><br /><label><input type="radio" name="widgetType" value="standard" checked="checked" /> Regular Widget</label><br /><label><input type="radio" name="widgetType" value="image" /> Image Widget</label></div>';
		
		dContent += '<p /><div><label><strong>URL (of Widget or Image):</strong><br /><input type="text" name="widgetURL" id="tdWidgetURL" style="width:250px;" /></label></div>';
		
		dContent += '</form></div>';
		
		addWidget.content.innerHTML = dContent;
		addWidget.object.style.display = '';
	},
	
	completeImageAdd: function(){
		if (document.tdAddWidgetForm.widgetType[0].checked) {
			new Desk.Widget($F('tdWidgetURL'));
		} else if (document.tdAddWidgetForm.widgetType[1].checked) {
			new Desk.ImageWidget($F('tdWidgetURL'));
		}
		
		Desk.closeDialog();
	},
	
	createButton: function(theText, onClickAction, centerOrFloat) {
		thisLink = document.createElement('div');
		thisLink.style.width = "105px";
		thisLink.style.height = "28px";
		thisLink.style.backgroundImage = "url('"+Desk.installDir+"/button.png')";
		/*thisLink.onmousedown = function(){
			this.style.backgroundImage = "url('"+Desk.installDir+"/button-pressed.png')";
			this.style.paddingTop = "10px";
			this.style.paddingLeft = "3px";
			this.style.height = "25px";
			this.style.width = "101px";
		};
		thisLink.onmouseup = function(){
			this.style.backgroundImage = "url('"+Desk.installDir+"/button.png')";
			this.style.paddingTop = "7px";
			this.style.paddingLeft = "-4px";
			this.style.width = "105px";
			this.style.height = "28px";
		};*/
		thisLink.style.cursor = "pointer";
		thisLink.style.margin = "1px";
		thisLink.style.color = "#333";
		thisLink.style.fontSize = "12pt";
		thisLink.style.fontFamily = "'Georgia', serif";
		thisLink.style.textAlign = "center";
		thisLink.style.paddingTop = "7px";
		thisLink.style.paddingLeft = "-4px";
		if (centerOrFloat == 'center') {
			thisLink.style.marginLeft = 'auto';
			thisLink.style.marginRight = 'auto';
		} else if (centerOrFloat == 'float') {
			thisLink.style.cssFloat = 'right';
		}
		thisLink.onclick = onClickAction;
		
		theText = document.createTextNode(theText);
		thisLink.appendChild(theText);
		
		return thisLink;
	},
	
	dimScreen: function(widgetDim){
		if (!$('widgetDimmer')) {
			var dimmer = document.createElement('div');
			dimmer.style.position = "fixed";
			dimmer.style.top = "0px";
			dimmer.style.left = "0px";
			dimmer.style.height = "100%";
			dimmer.style.width = "100%";
			dimmer.style.backgroundImage = "url('"+Desk.installDir+"/dim.png')";
			dimmer.style.zIndex = (widgetDim) ? 8 : (200 + Desk.highestLevel);
			dimmer.setAttribute('id', 'widgetDimmer');
			dimmer.innerHTML = "&nbsp;";
			
			if (widgetDim) {
				dimmer.onclick = Desk.hideWidgets;
			}
			
			document.getElementsByTagName('body')[0].appendChild(dimmer);
			
			if (widgetDim) {
				Desk.widgetDimmer = true;
			}
		}
	},
	
	undimScreen: function(){
		if ($('widgetDimmer')) {
			document.getElementsByTagName('body')[0].removeChild($('widgetDimmer'));
		}
		Desk.widgetDimmer = false;
	},
	
	hideWidgets: function(){
		var allDivs = document.getElementsByTagName('div');
		
		for (var i=0; i < allDivs.length; i++) {
			if (allDivs[i].className.indexOf('tdWidget') > -1) {
				allDivs[i].style.display = 'none';
			}
		}
		
		if ($('tuxDeskStatusMessage')) {
			$('tuxDeskStatusMessage').style.display = 'none';
		}
		
		Desk.widgetDisplay = 'none';
		if (Desk.fadedBackground) {
			Desk.undimScreen();
		}
	},
	
	showWidgets: function(){
		var allDivs = document.getElementsByTagName('div');
		
		for (var i=0; i < allDivs.length; i++) {
			if (allDivs[i].className.indexOf('tdWidget') > -1) {
				allDivs[i].style.display = '';
			}
		}
		
		if ($('tuxDeskStatusMessage')) {
			$('tuxDeskStatusMessage').style.display = '';
		}
		
		if (Desk.fadedBackground) {
			Desk.dimScreen(true);
		}
		Desk.widgetDisplay = '';
	},
	
	toggleWidgetDisplay: function(){
		if (Desk.widgetDisplay == 'none') {
			Desk.showWidgets();
		} else {
			Desk.hideWidgets();
		}
	},
	
	/* Cookie functions from Quirksmode.org */
	
	storeSetting: function(name, value, days){
		if (days) {
			var date = new Date();
			date.setTime(date.getTime()+(days*24*60*60*1000));
			var expires = "; expires="+date.toGMTString();
		}
		else var expires = "";
		document.cookie = name+"="+value+expires+"; path=/";
	},
	
	getSetting: function(name){
		var nameEQ = name + "=";
		var ca = document.cookie.split(';');
		for(var i=0;i < ca.length;i++) {
			var c = ca[i];
			while (c.charAt(0)==' ') c = c.substring(1,c.length);
			if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
		}
		return null;
	},
	
	/* End Cookie Functions */
	
	clearSetting: function(name){
		Desk.storeSetting(name,"",-1);
	},
	
	setSitePref: function(url, prefName, prefValue){
		if (!Desk.sitePrefs[url]) Desk.sitePrefs[url] = {};
		if (!Desk.sitePrefs[url][prefName]) Desk.sitePrefs[url][prefName] = {};
		Desk.sitePrefs[url][prefName].isPref = true;
		Desk.sitePrefs[url][prefName].value = prefValue;
	},
	
	aboutTuxDesk: function(){
		Desk.initialize();
		Desk.dimScreen();
		var widgetContent = '';
		var aboutWin = Desk.makeDialog('About', [{title:'Close', onclick:function(){Desk.closeDialog();return false;}}]);
		
		widgetContent = "<div><div><strong>Tux Desk</strong></div><div style=\"margin-bottom:10px;\"><cite style=\"font-size:10pt;\">by Matt Patenaude</cite></div><div>";
		
		widgetContent += "<p style=\"font-size:10pt;\">My first step towards creating an atmosphere conducive to a web-based lifestyle, Tux Desk enables website owners to run any number of small, interactive programs called widgets on any website in the world, just by installing a few scripts on their website. These widgets hover over whatever page Tux Desk is activated on, draggable wherever you like. All widgets are stored on their creators' websites, making it possible to use <em>any</em> widget on your Tux Desk site without installing extra software.</p><p style=\"font-size:10pt;\">Oh, and did I mention it's really cool? :)</p><p style=\"font-size:10pt;\">The original idea for Tux Desk was based on an awesome web app called <a href=\"http://mooglets.freewebsfarms.com\">mooglets</a>.</p>";
		
		widgetContent += "</div></div>";
		
		aboutWin.content.innerHTML = widgetContent;
		aboutWin.object.style.display = "";
	},
	
	initialize: function(){
		if (!Desk.initialized) {
			if (thePrefs = Desk.getSetting('tuxDeskPrefs')) {
				Desk.storedPrefs = thePrefs.evalJSON(true);
			}
			
			var theStyler = document.createElement('link');
			theStyler.setAttribute('type', 'text/css');
			theStyler.setAttribute('rel', 'stylesheet');
			theStyler.setAttribute('href', Desk.installDir + '/td-style.css');
			theStyler.setAttribute('media', 'screen');
			
			document.getElementsByTagName('head')[0].appendChild(theStyler);
			
			var printSuppress = document.createElement('style');
			printSuppress.setAttribute('type', 'text/css');
			
			var suppressor = document.createTextNode('@media print { .tuxDeskObject { display: none; } }');
			
			printSuppress.appendChild(suppressor);
			
			document.getElementsByTagName('head')[0].appendChild(printSuppress);
			
			/* preload images */
			
			if (document.images && Desk.preloadImages) {
				collapseImg = new Image(40, 40);
				collapseImg.src = Desk.installDir+'/collapse.png';
				
				closeImg = new Image(40, 40);
				closeImg.src = Desk.installDir+'/close.png';
				
				dragImg = new Image(40, 40);
				dragImg.src = Desk.installDir+'/drag.png';
				
				pTopImg = new Image(397, 87);
				pTopImg.src = Desk.installDir+'/pref-top.png';
				
				pFillImg = new Image(397, 1);
				pFillImg.src = Desk.installDir+'/pref-fill.png';
				
				pBotImg = new Image(397, 65);
				pBotImg.src = Desk.installDir+'/pref-bottom.png';
				
				statusImg = new Image(200, 100);
				statusImg.src = Desk.installDir+'/status.png';
				
				panelImg = new Image(200, 250);
				panelImg.src = Desk.installDir+'/panel.png';
				
				cpbImg = new Image(27, 250);
				cpbImg.src = Desk.installDir+'/control-panel-button.png';
				
				buttonImg = new Image(107, 35);
				buttonImg.src = Desk.installDir+'/button.png';
				
				// buttonPImg = new Image(107, 35);
				// buttonPImg.src = Desk.installDir+'/button-pressed.png';
				
				dimImg = new Image(1, 1);
				dimImg.src = Desk.installDir+'/dim.png';
			}
			
			if (Desk.fadedBackground && Desk.widgetDisplay == '') {
				Desk.dimScreen(true);
			}
			Desk.initialized = true;
		}
	}
};

Desk.Widget = Class.create();
Desk.Widget.prototype = {
	preferences: {},
	initialize: function(widgetURL){
		Desk.initialize();
		Desk.widgetsLoading++;
		Desk.statusCheck();
		this.serial = Desk.widgetSerial++;
		this.url = widgetURL;
		Desk.widgets[this.serial] = this;
		this.request = new Ajax.Request(Desk.installDir+'/widgeter.php', {method:'post', parameters:'serial='+this.serial+'&url='+encodeURIComponent(this.url), onComplete:Desk.makeWidget});
	},
	
	globalize: function(theWidget){
		this.widgetFunctions = {
			getElement: function(theClassName) {
				var theElements = $('widgetContent'+theWidget.serial).getElementsByTagName('*');
				
				for (var i=0; i < theElements.length; i++) {
					if (theElements[i].className.indexOf(theClassName) > -1) {
						return theElements[i];
					}
				}
			},
			getPref: function(prefName){
				return theWidget.info.prefs[prefName].value;
			},
			setPref: function(prefName, prefValue){
				theWidget.info.prefs[prefName].value = prefValue;
			},
			openPreferences: function(){
				Desk.openPrefWindow(theWidget.serial);
			},
			openAbout: function(){
				Desk.openAboutWindow(theWidget.serial);
			},
			
			timeout: function(theCommand, theTime) {
				return setTimeout(function(){if($('widget'+theWidget.serial)) eval(theCommand);}.bind(theWidget.script), theTime);
			},
			
			getXML: function(theURL, userOptions) {
				this.ajax(theURL, userOptions, 'text/xml');
			},
			
			getHTML: function(theURL, userOptions) {
				this.ajax(theURL, userOptions, 'text/html');
			},
			
			ajax: function(theURL, userOptions, forceType) {
				var theOptions = {};
				if (userOptions.onComplete) {
					theOptions.onComplete = userOptions.onComplete.bind(theWidget.script);
				}
				
				if (userOptions.onSuccess) {
					theOptions.onSuccess = userOptions.onSuccess.bind(theWidget.script);
				}
				
				if (userOptions.onFailure) {
					theOptions.onFailure = userOptions.onFailure.bind(theWidget.script);
				}
				theOptions.parameters  = (forceType) ? 'type='+forceType+'&' : '';
				theOptions.parameters += 'url='+encodeURIComponent(theURL);
				theOptions.method = 'post';
				new Ajax.Request(Desk.installDir+'/siter.php', theOptions);
			}
		}
	}
};
Desk.ImageWidget = Class.create();
Desk.ImageWidget.prototype = {
	initialize: function(imageURL){
		Desk.initialize();
		Desk.widgetsLoading++;
		Desk.statusCheck();
		this.serial = Desk.widgetSerial++;
		this.url = imageURL;
		Desk.widgets[this.serial] = this;
		Desk.makeImageWidget(this);
	}
};

