/**
 * Spray.se global js library
 * Contains all basic and common functionality needed for spray.se
 *
 * @author Rasmus Andersson
 * @author Kristofer Noren
 */


if ( location.host.indexOf('spray.se') > -1 )
    document.domain = 'spray.se';


// Minimal prototype lib
function $() {
	var elements = new Array();
	
	for (var i = 0; i < arguments.length; i++) {
		var element = arguments[i];
		if (typeof element == 'string')
			element = document.getElementById(element);
	
		if (arguments.length == 1)
			return element;
	
		elements.push(element);
	}
	
	return elements;
}

document.getElementsByClassName = function(className, parentElement)
{
	var children = ($(parentElement) || document.body).getElementsByTagName('*');
	var elements = [];
	
	for(var i=0;i<children.length;i++)
		var child = children.item(i);
		if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) 
			elements.push(child);
	
	return elements;
}

var Position = {
	realOffset: function(element) {
		var valueT = 0, valueL = 0;
		do {
			valueT += element.scrollTop  || 0;
			valueL += element.scrollLeft || 0;
			element = element.parentNode;
		} while (element);
		return [valueL, valueT];
	},
	
	cumulativeOffset: function(element) {
		var valueT = 0, valueL = 0;
		do {
			valueT += element.offsetTop  || 0;
			valueL += element.offsetLeft || 0;
			element = element.offsetParent;
		} while (element);
		return [valueL, valueT];
	},
	
	within: function(element, x, y) {
		var offset = Position.cumulativeOffset(element);
		return (y >= offset[1] &&
		y <  offset[1] + element.offsetHeight &&
		x >= offset[0] &&
		x <  offset[0] + element.offsetWidth);
	}
};


// Global stuff
var base = {
	
	isIE: window.navigator.userAgent.indexOf("MSIE") != -1,
	isFirefox: window.navigator.userAgent.indexOf('Firefox') != -1,
	
	_triggerOnLoad: new Array(),
	_triggerOnResize: new Array(),
	
	triggerOnLoad: function(func) {
		base._triggerOnLoad.push(func);
	},
	
	triggerOnResize: function(func) {
		base._triggerOnResize.push(func);
	},
	
	onLoad: function() {
		// Remove dots from active links
		if (base.isFirefox) {
			document.onmousedown = function() {
				for (a in document.links)
					document.links[a].onfocus = document.links [a].blur;
			}
		}
		
		tracking.init();
		image.init();
		
		// Trigger all registered for onLoad
		for (var i=0;i<base._triggerOnLoad.length;i++)
			base._triggerOnLoad[i]();
	},
	
	onResize: function() {
		for (var i=0;i<base._triggerOnResize.length;i++)
			base._triggerOnResize[i]();
	},
	
	// Delay execution (workaround for IE which does not handle setTimeout with an argument)
	runLater: function(callback, delay, arg) {
		if(base.isIE) {
			base._runLaterQueue.push([delay, callback, arg]);
			setTimeout(base._runLaterPickup, delay);
		}
		else
			setTimeout(callback, delay, arg);
	},
	_runLaterQueue: [],
	_runLaterPickup: function() {
		var lowest = [999999999,function(){}, null];
		var lowestIndex = -1;
		
		for(var i=0;i<base._runLaterQueue.length;i++) {
			var cb = base._runLaterQueue[i];
			if(cb[0] < lowest[0]) {
				lowest = cb;
				lowestIndex = i;
			}
		}
		
		if(lowestIndex != -1) {
			base._runLaterQueue.splice(lowestIndex,1);
			lowest[1](lowest[2]);
		}
	},
	
	// Hide content
	hideContent: function(element, existsCallback, missingCallback, timeout)
	{
		// Exists?
		if(element == null || typeof element == "undefined") {
			//missingCallback.apply(this);
			return;
		}

		// Save properties at first run
		if(typeof element.hideContentTimeout == "undefined") {
			element.hideContentTimeout = timeout;
			element.hideContentMaxIters = timeout / 500;
			element.hideContentIters = 0;
			element.hideContentExistsCallback = existsCallback;
			element.hideContentMissingCallback = missingCallback;
		}
		
		var state = 0; // 0 = unknown, 1 = exists, 2 = missing
		
		// Set to exists after timeout
		if(element.hideContentIters++ > element.hideContentMaxIters)
			state = 2;
		
		// Check if empty
		if(state == 0) {
			if(element.innerHTML == "") {
				base.runLater(base.hideContent, 500, element);
				return;
			}
			else
				state = (element.innerHTML.indexOf('_null_ad') == -1) ? 1 : 2;
		}
		
		// Exists?
		if(state == 1)
			element.hideContentExistsCallback();
		else
			element.hideContentMissingCallback();
	},
	
	captureMousePosition: function() {
		if(!document.all)
			document.captureEvents(Event.MOUSEMOVE);
		document.onmousemove = base._regMousePos;
	},
	
	mousePosition: {x:0, y:0}, // Will be available after calling registerMousePosition() ONCE
	
	// private
	_regMousePos: function(e) {
		var x = 0;
		var y = 0;
		if (!e) var e = window.event;
		if (e.pageX || e.pageY)
		{
			x = e.pageX;
			y = e.pageY;
		}
		else if (e.clientX || e.clientY)
		{
			x = e.clientX + document.body.scrollLeft;
			y = e.clientY + document.body.scrollTop;
		}
		base.mousePosition = {x:x<0 ? 0 : x, y:y<0 ? 0 : y};
		return true;
		/*var x,y;
		if(document.all) {
			x = event.clientX + document.body.scrollLeft;
			y = event.clientY + document.body.scrollTop;
		} else {
			x = e.pageX;
			y = e.pageY;
		}
		base.mousePosition = {x:x<0 ? 0 : x, y:y<0 ? 0 : y};
		return true;*/
	}
};


/**
 * Debug
 * debug.enabled: Check if the client is comming through dev.i.spray.se or live
 * debug.alert(): Display an alert box ONLY ON dev.i.spray.se
 */
var debug = {
	enabled: (document.location.host.substring(0,3) == "dev" || document.location.host.substring(0,7) == "www.dev"),
	alert: function(msg) {
		if(!debug.enabled)
			return;
		alert("(DEBUG)\n"+msg);
	}
};


/**
 * Tracking
 *
 * Link/Bounce tracking is done by specifying the "track" class in a A element, 
 * and adding a cuton attribute; "trackid".
 *
 * Example:
 * <a href="http://inhouse/rules" class="myclass track:TRACK_ID ...">Hej</a>
 *
 */
var tracking = {
	
	init: function() {
		
		var children = document.body.getElementsByTagName('*');
		var re = new RegExp("(^|\\s)track:([^\\s]+)(\\s|$)");
		var trackid = "";
		//var tmps = "";
		
		for(var i=0;i<children.length;i++)
		{
			var child = children.item(i);
			re.exec(child.className);
			if (trackid = re.exec(child.className))
			{
				//tmps += i + " ("+child+"): " + child.getAttribute("href") + "<br />\n";
				child.className = child.className.replace(re, " ");
				child.trackid = trackid[2];
				child.onclick = function() {
					var baseURL = "http://lycos.spray.se/cgi-bin/nph-bounce?" + this.trackid + "|";
					if(typeof this.href == "undefined")
						this.href = this.getAttribute("href");
					if(this.href != null) {
						if(this.tagName == "A")
							this.href = baseURL + this.href;
						else {
							//debug.alert("document.location.href = "+baseURL + this.href);
							document.location.href = baseURL + this.href;
						}
					}
					else {
						debug.alert("ERROR in tracking.init(): tracked element "+child+" (track:"
							+this.trackid+") is missing href attribute. Unable to tag it.");
					}
					return true;
				}
			}
		}
		//document.write(tmps);
	}	
};

var utils = {
	newAsyncRequest: function() {
		var r=false;if(window.XMLHttpRequest){r=new XMLHttpRequest();}else if(window.ActiveXObject){try{r=new ActiveXObject("Msxml2.XMLHTTP");}catch(e1){try {r=new ActiveXObject("Microsoft.XMLHTTP");}catch(e2){alert("Din webbläsare stöder inte alla funktioner som finns på Spray. Ladda ner Mozilla Firefox från www.mozilla.com");}}}return r;
	}
};

// Advertising
var ads = {
	/**
	 * Hide rectangle when no ad
	 *
	 * @param  String  Optional element. Defaults to $("adrectangle")
	 * @return void
	 */
	hideRectangle: function(element)
	{
		if(typeof elementId == "undefined")
			element = $('adrectangle');
		
		base.hideContent(element, function(){}, function(){
			this.style.display = 'none';
		}, 2500);
	}
}

// Image-related functionality
var image = {

	_preloadQueue: [],
	
	// Queue an image for preloading. (Variadic arguments)
	preload: function() {
		for(var i=0; i < arguments.length; i++)
			image._preloadQueue.push(arguments[i]);
	},
	
	// Preload images
	init: function(){
		for (i=0;i<image._preloadQueue.length;i++){
			var im = new Image();
			im.src = image._preloadQueue[i];
			image._preloadQueue[i] = im;
		}
	},
	
	autohover: function(element, fileExtension, state){
		element = $(element);
		var state = state ? '_hover' : '';
		element.style.backgroundImage='url(./_res/img/content/' + element.id + state + '.' + fileExtension + ')';
	},
	
	ehover: function(element, imgUrl) {
		$(element).style.backgroundImage='url(' + imgUrl + ')';
	}
};

// ----------

// Register window event handlers
window.onload = base.onLoad;
window.onresize = base.onResize;

// TODO: Spraydio:
//function openPlayer() REPLACED BY popup("http://www.nwrweb.com/player/show/spray/radiocitysthlm/20/", 535, 424, false, false, "NWRPlayer");
function popup(sUrl, iWidth, iHeight, bScrollbars, bResizable, sWinName) {
	var win = window.open(sUrl, 
		(typeof sWinName == "undefined" ? "spraypopup" : sWinName), 
		"width=" + iWidth + ",height=" + iHeight + ",scrollbars=" 
			+ (typeof bScrollbars == "undefined" ? "auto" : (bScrollbars ? "yes" : "no"))
			+ (typeof bResizable == "undefined" ? "no" : (bResizable ? "yes" : "no"))
	);
	win.focus();
}

function openWin(sUrl, sName, iWidth, iHeight, sScrollbars) {
	var win = window.open(sUrl, sName, "width=" + iWidth + ",height=" + iHeight + ",scrollbars=" + sScrollbars);
	win.focus();	
}

//// -----------------------------------------------------------------------------------------------------------------------

// for login box
function storeLoginUsername(sUsername) {
	var ExpireDate = new Date();
	ExpireDate.setTime(ExpireDate.getTime() + (31 * 24 * 3600 * 1000)); //one month
	document.cookie = "username=" + escape(sUsername) + "; expires=" + ExpireDate.toGMTString();
	return true;
}

function getLeft(ref) {
	var offsetObj = document.getElementById(ref);
	var objOffsetTop = objOffsetLeft = 0;

	while(offsetObj != document.body){
		objOffsetLeft += offsetObj.offsetLeft;
		offsetObj = offsetObj.offsetParent;
	}
	return objOffsetLeft;
}
function getTop(ref) {
	var offsetObj = document.getElementById(ref);
	var objOffsetTop = objOffsetLeft = 0;

	while(offsetObj != document.body){
		objOffsetTop += offsetObj.offsetTop;
		offsetObj = offsetObj.offsetParent;
	}
	return objOffsetTop;
}

function placeObj(actObj,fromDiv,x,y){
	var activeObj = document.getElementById(actObj);
	activeObj.style.left = getLeft(fromDiv) + x + 'px';
	activeObj.style.top = getTop(fromDiv) + y + 'px';
	activeObj.style.display = 'block';
}

function trackUrl(url,clickArg){
	newUrl = "http://lycos.spray.se/cgi-bin/nph-bounce?" + clickArg + "|" + url.href;
	url.href=newUrl;
}

/* Tooltip */
var showtip = 'true';
function showtooltip(text){
	var showtip = 'true';
	document.getElementById('tooltip').innerHTML = text;
	document.onmousemove = mouseMove;
	setTimeout("tryshow()", 700);
}
function tryshow(){
	if(document.getElementById('tooltip').innerHTML != ""){
		document.getElementById('tooltip').style.display = "block";
		
	}
}
function hidetip(){
		document.getElementById('tooltip').innerHTML = "";
		document.getElementById('tooltip').style.display = "none";
		var showtip = 'false';
}
function mouseMove(ev){
		ev           = ev || window.event;
		var mousePos = mouseCoords(ev);
		document.getElementById('tooltip').style.top = mousePos.y+10+'px';
		document.getElementById('tooltip').style.left = mousePos.x+15+'px';
}
function mouseCoords(ev){
	if(ev.pageX || ev.pageY){
		return {x:ev.pageX, y:ev.pageY};
	}
	
	else{
	return {
		x:ev.clientX + document.documentElement.scrollLeft - document.body.clientLeft,
		y:ev.clientY + document.documentElement.scrollTop  - document.body.clientTop
	};
	}
}

/* Searchbar optimised for eniro */
function showTwo(type){
	$('eniro_kopsalj_container').style.display='none';
	if(type=='gula'){
		var field1 = 'Rubrik, företag, sökord, telefonnr.';
		var field2 = 'Område, gatuadress, ort, postnr.';
	}
	if(type=='maps'){
		var field1 = 'Företagsnamn, rubrik eller telefonnr.';
		var field2 = 'Adress, plats eller ort.';
	}
	if(type=='personer'){
		var field1 = 'Namn, telefonnr, mobilnr.';
		var field2 = 'Område, ort, postnr';
	}
	if(type=='kopsalj'){
		var field1 = 'Vad';
		var field2 = '1';
		$('eniro_kopsalj').innerHTML='Hela landet';
		$('eniro_kopsalj_container').style.display='block';
	}
	$('two-fields').style.display='block';
	$('field1').value = field1;
	$('field2').value = field2;
}

function checkText(field){
	if($('field'+field).value == 'Rubrik, företag, sökord, telefonnr.' || $('field1').value == 'Namn, telefonnr, mobilnr.' || $('field1').value == 'Vad' || $('field1').value == 'Företagsnamn, rubrik eller telefonnr.'){
		$('field'+field).value = "";
	}
	else if($('field'+field).value == 'Område, gatuadress, ort, postnr.' || $('field2').value == 'Område, ort, postnr' || $('field2').value == 'Var' || $('field2').value == 'Adress, plats eller ort.'){
		$('field'+field).value = "";
	}
}

/* shows or hides element depending on current state */
function showHide(o){
	if($(o).style.display!='block'){$(o).style.display='block'}
	else{$(o).style.display='none'}
}
/* javascript dropdown sets $formelement, $formelement_value, $dropdownbox, $dropdownbox_text*/
function selectBox(valElem,value,dropId,showText){
	$(valElem).value=value;
	$(dropId).innerHTML=showText;
}
