
// return a reference to the supplied object, whether we refer to it by name or by reference
function getLazyReference(obj)
{
	if (obj.id)
	{
		return obj;
	}
	else
	{
		return document.getElementById(obj);
	}
}


// actually add an event listener, regardless of browser
function addListener(obj, eventType, listenerFunction)
{
	if (!obj)
	{
		alert("bad object for " + eventType + ", obj:" + obj + ", fn:" + listenerFunction + ", caller:" + addListener.caller);
		return;
	}
	if (obj.addEventListener)
	{
		obj.addEventListener(eventType, listenerFunction, true);
		
	}
	else if (obj.attachEvent)
	{
		var success = obj.attachEvent("on" + eventType, listenerFunction);
	}
}

function cancelEvent(e)
{
	e.cancelBubble = true;
	
	if (e.preventDefault)
	{
		e.preventDefault()
	}
	
	if (e.stopPropagation)
	{
		e.stopPropagation()
	}
	
	return false;
}


function slideElementTo(element, x, y, stepCount, hideOnArrival)
{
	var obj = getLazyReference(element);
	
	if (obj.cancelSlide)
	{
		obj.cancelSlide = null;
		return;
	}
	
	var currentX = parseInt(obj.style.left);
	var currentY = parseInt(obj.style.top);
	
	if (!isNaN(currentX))
	{
		var newX = currentX + (x - currentX)/stepCount;
		obj.style.left = newX + 'px';
	}
	if (!isNaN(currentY))
	{
		var newY = currentY + (y - currentY)/stepCount;
		obj.style.top = newY + 'px';
	}
	
	
	if (stepCount > 1)
	{
		hideOnArrival = (hideOnArrival) ? true : false; // deal with possible nulls
		var script = "slideElementTo('" + obj.id + "', " 
						+ x + ", " 
						+ y + ", " 
						+ (stepCount-1) + ", "
						+ hideOnArrival + ")";

		setTimeout(script, 30);  
	}
	else if (hideOnArrival)
	{
		obj.style.display = "none";
	}
	
}   

function fadeElementOut(id, count, doc)
{
	doc = doc ? doc : document;
	try
	{
		var obj = doc.getElementById(id);
		if (!obj)
		{
			log("bad object: " + id);
			return;
		}
		
		obj.style.filter = "alpha(opacity:" + count + ")";
		obj.style.MozOpacity = count/100;
		obj.style.opacity = count/100;
		
		if (count > 0)
		{
			setTimeout(function(){fadeElementOut(id, count-5, doc);}, 30);
		}
		else
		{
			obj.style.display="none";
		}
	}
	catch(ex)
	{
		// This is just a silly effect.  It's not worth throwing if it fails.
		// NOTE: we end up here sometimes if the page is redirected mid fade.
	}
}
 





// logging


function trace(obj, goBig)
{
	var txt = document.getElementById('txt');
	if (txt == null)
	{
		return;
	}
	
	txt.value += obj + "\r\n";
	
	if (goBig)
	{
		for (key in obj)
		{
			txt.value += key + ":" + obj[key] + "\r\n";
			
		}
		txt.value += "\r\n\r\n";
	}

}

var logShouldClear = true;
function log(text, clear)
{
	var txt = document.getElementById("txt");
	if (txt)
	{
		if (clear || logShouldClear)
		{
			txt.value = "";
		}
		txt.value = txt.value + text + "\r\n";
	}
	
	logShouldClear = false;
	setTimeout("logShouldClear = true", 100);
}

function logMulti()
{
	var line = "";
	var isFirst = true;
	for (var a=0; a<logMulti.arguments.length; a++)
	{
		if (!isFirst)
		{
			line += ", ";
		}
		line += logMulti.arguments[a];
		isFirst = false;
	}

	log(line);
}

function alertMulti()
{
	var line = "";
	var isFirst = true;
	for (var a=0; a<alertMulti.arguments.length; a++)
	{
		if (!isFirst)
		{
			line += ", ";
		}
		line += alertMulti.arguments[a];
		isFirst = false;
	}

	alert(line);
}












// communication

var Loader = new Object();
Loader.xmlhttp = null;
Loader.baseUrl = "/get/";
Loader.callback = null;
Loader.execute = false;

// TODO - queue

Loader.loadXMLDoc = function(url)
{
	Loader.xmlhttp=null
	
	if (Loader.xmlhttp == null)
	{
		// code for Mozilla, etc.
		if (window.XMLHttpRequest)
		{
			Loader.xmlhttp=new XMLHttpRequest()
		}
		// code for IE
		else if (window.ActiveXObject)
		{
			Loader.xmlhttp=new ActiveXObject("Microsoft.XMLHTTP")
		}
	}
	
	if (Loader.xmlhttp!=null)
	{
		Loader.xmlhttp.onreadystatechange = Loader.state_Change
		Loader.xmlhttp.open("GET",url,true)
		Loader.xmlhttp.send(null)
	}
	else
	{
		alert("Your browser does not support XMLHTTP.")
	}
}

Loader.state_Change = function()
{
	if (!window.Loader.xmlhttp)
	{
		log("got to state_Change() with Loader.xmlhttp undefined");
		return;
	}
	
	// if Loader.xmlhttp shows "loaded"
	if (Loader.xmlhttp.readyState==4)
	{
		// if "OK"
		if (Loader.xmlhttp.status==200)
		{
			//log('done');
			//log('response:' + Loader.xmlhttp.responseText);
				if (Loader.xmlhttp 
					&& Loader.xmlhttp.responseText 
					&& Loader.xmlhttp.responseText != "")
				{
					var obj = null;
					if (Loader.execute)
					{
						obj = eval("(" + Loader.xmlhttp.responseText + ")");
					}
					else
					{
						// parsing XML sucks.  We'll go oldskool instead.
						var txt = Loader.xmlhttp.responseText
						var splitter = txt.indexOf("|");
						if (splitter > 0 )
						{
							var id = txt.substr(0,splitter);
							var html = txt.substr(splitter+1);

							html = Loader.FixRelativeLinks(html);
							
							if (document.getElementById(id))
							{
								document.getElementById(id).innerHTML = html;					
							}
						}
					}
					
					
					if (Loader.callback)
					{
						Loader.callback(obj);
					}
				}
			try
			{
			}
			catch(e)
			{
			}
		}
		else
		{
			alert("Pushing a new build.  Chill a second, then hit OK.")
		}
	}
	
}

Loader.FixRelativeLinks = function(html)
{
	var reg = new RegExp(Loader.baseUrl, "g");
	html = html.replace( reg, location.pathname, true);
	return html;
}

Loader.Load = function(content, target, params, callback)
{
	var url = this.baseUrl 
			+ "?control=" + content
			+ "&target=" + target;
			
	if (params)
	{
		url = url + "&" + params;
	}	
	url = url + "&rand=" + Math.random();
	
	this.callback = callback;
	this.execute = false;
	this.loadXMLDoc(url);		
}

Loader.ExecuteWebServiceRequest = function(url, callback)
{
	this.callback = callback;
	this.execute = false;
	this.loadXMLDoc(url);		
}

Loader.ExecuteJsonRequest = function(url, callback)
{
	this.callback = callback;
	this.execute = true;
	this.loadXMLDoc(url);		
}

Loader.LoadNarcistatHits = function(callback, host, since)
{
	var url = this.baseUrl
			+ "?mode=json"
			+ "&host=" + host;
			
	if (since)
	{
		var dateString = since;
		if (since.getUTCMonth)
		{
			// yyyy-MM-ddTHH:mm:ssZ
			dateString = since.getYear()
							+ "-" + ensureTwoDigit(since.getUTCMonth()+1)
							+ "-" + ensureTwoDigit(since.getUTCDate())
							+ "T" + ensureTwoDigit(since.getUTCHours())
							+ ":" + ensureTwoDigit(since.getUTCMinutes())
							+ ":" + ensureTwoDigit(since.getUTCSeconds())
							+ "Z";
		}
			
//log(dateString);			

		url = url + "&since=" + dateString;
	}			

	Loader.ExecuteJsonRequest(url, callback);
}


function ensureTwoDigit(number)
{
	number = (number % 100) + 100;
	
	return (number + "").substr(1);
}




Loader.LoadMedia = function(callback)
{
	// http://blogabond.dev/WebServices/Loader.aspx?control=LocationDetail&target=divContent&locationID=100
	//this.Load("MediaToolPalette", "divMediaPalette", null, callback);
	this.Load("MediaToolPalette", "divMediaPalleteScroll", null, callback);

}

Loader.LoadSnapShot = function(callback, actionID)
{
	// http://dev.twiddla/WebServices/Loader.aspx?control=SnapShotActions&target=divActions&actionID=24881
	this.Load("SnapShotActions", "divActions", "actionID=" + actionID, callback);

}

Loader.CopyMedia = function(callback, fromUserID, src)
{
	var url = format("/WebServices/CopyMediaService.aspx")
			+ "?userid=" + fromUserID
			+ "&src=" + src
			+ "&rand=" + Math.random();

	this.ExecuteWebServiceRequest(url, callback);
}

