
//voeg browsercompatible events toe aan element voor als je jquery niet gebruikt ergens
// gebruiken in plaats van 'onclick=' want dan kan je maar 1 event ergens aan hangen.
//
// element    - element waar je iets aan wil hangen
// eventType  - 'click', 'load', etc, de 'on[iets]' zonder de 'on' 
// callback   - de functie die wordt aangeroepen
// useCapture - zie https://developer.mozilla.org/en/DOM/element.addEventListener en 
//                  http://www.w3.org/TR/DOM-Level-3-Events/#event-flow
//
function idd_addEvent(element, eventType, callback, useCapture) {
	
	//default value
	if (useCapture === undefined ) useCapture = false;
	
	//wereld
	if (element.addEventListener) {
		element.addEventListener(eventType, callback, useCapture);
		return true;
	} 
	
	//voor IE < 9
	if (element.attachEvent) {
		var ret = element.attachEvent('on'+eventType, callback);
		return ret;
	}
} 





// idd_assert controleert feitelijk of je true of false meegeeft. Indien je false meegeeft 
// dan wordt een error gelogd in de browser z'n JavaScript Console. Je kan dit gebruiken als sanity checks voor
// dingen die altijd waar moeten zijn.
// 
//  IN: exp     - boolean
//      message - mogelijk commentaar voor in de JavaScript Console log.
// UIT: waarde die exp oplevert of de boolean die je meegaf.
function idd_assert(exp, message) {
	
	if ( typeof exp !== 'boolean') {
		throw new Error("Given expression is not a boolean type.\n\n" + "Callstack:\n" + callstack().join("\n"));
	}
	
	if ( !exp ) {
		message = typeof(message) !== 'undefined' ? message : 'Unexpected error occurred.';
		
		throw new Error("Assertion: - " + message + " - failed in...\n\n" + "Callstack:\n" + callstack().join("\n"));
	}
	
	return exp;
}



//om makkelijk te kunnen bepalen of we idd zijn; in javascript niet voor de hand liggend; een lijst
// met IP adressen is veel te gevoelig.
//
// poog te kijken naar de url, als daar geen www. voor staat is het waarschijnlijk een zandbak
//
//  IN: -
// UIT: true/false
function idd_isidd() {
	var hier = location.href;
	
	// vrijwel al onze sites hebben hoogstens twee punten in de naam
	// www.iidesk.com, iidesk.com
	// alleen ii.nl is uitzondering: i.ii.nl etc.
	// als het dan jasper.i.ii.nl is dan is het debug
	var iinl = /https?:\/\/([^.]+\.)?([^.]+\.)?ii\.nl\//gi;
	var tweepunt = /https?:\/\/([^.]+)\.[^.]+\.(com|nl)\//gi;
	var driepunt = /https?:\/\/([^.]+)\.[^.]+\.[^.]+\.(com|nl)\//gi;
	var match;
	
	//is het de uitzondering
	if (null !== (match = iinl.exec(hier))) {
		if (null !== (match = driepunt.exec(hier))) {
			return match[1] != 'www';
		}
		
		//nu werkt het alleen nog niet goed voor xxx.ii.nl zelf
		
	} else {
		//dan alleen xxx.iidesk.com accepteren als 
		if (null !== (match = tweepunt.exec(hier))) {
			return match[1] != 'www';
		}
	}
	
	//de rest (eenpunt)
	return false;
	
}

// Detecteerd of dit idd is en of er wel een console is om naar te loggen, zodat de pagina
// niet vastloopt als er geen console open is maar wel wordt gelogd.

function idd_print_r(message,name) {
	if (!idd_isidd()) return;
	
	if (window.console && console.log !== undefined) {
		if (name === undefined) {
			return console.log(message);
		} else {
			return console.log(message,name);
		}
	}
}

function idd_time(name) {
	if (!idd_isidd()) return;
	
	if (window.console && console.time !== undefined) {
		return console.time(name);
	}
}

function idd_timeEnd(name) {
	if (!idd_isidd()) return;
	
	if (window.console && console.time !== undefined) {
		return console.timeEnd(name);
	}
}

//genereert een hopelijk opvallende alert
// de volgende alert komt iets lager maar kan onder de vorige vallen
// IN: message - de boodschap die je af wilt beelden
gIddAlertYPosition = 5;
function idd_alert(message) {
	if (!idd_isidd()) return;
	
	
	var alertbox = document.createElement('div');
	
	alertbox.style.border          = 'solid 3px red';
	alertbox.style.fontSize        = '20px';
	alertbox.style.color           = 'red';
	alertbox.style.position        = 'fixed';
	alertbox.style.top             = gIddAlertYPosition + 'px';
	alertbox.style.right           = '5px';
	alertbox.style.backgroundColor = 'white';
	alertbox.style.padding         = '5px';
	alertbox.style.zIndex          = '999';
	
	var text = document.createTextNode(message);
	alertbox.appendChild(text);
	
	document.body.insertBefore(alertbox,document.body.firstChild);

	//43 is 20px font + 2*5px padding plus 3px border
	gIddAlertYPosition += 43;
}
	


//jquery om alle inputs onchange een warning te laten genereren als je de pagina verlaat zonder te submitten.
//
// event   - zodat je dit kan runnen als een event handler
//
// usage: idd_addEvent(window, 'load', idd_formChangedLeavePageWarning); ergens in de initroutines
//	skipt elements met class='noLeavePageWarning'
//
function idd_formChangedLeavePageWarning(event) {

	//jquery nodig
	if (typeof jQuery == 'undefined') {
		idd_alert('idd_fromChangedLeavePageWarning: jquery not loaded');
		return;
	}
		
	//http://mathiasbynens.be/notes/oninput
		
	//als er een verandering is in een input zetten we onbeforeunload van window
	$("input:not(.noLeavePageWarning)").each( function() { 
		//"change" vuurt pas als je de input verlaat met je focus. dus als je iets verandert en dan
		// *gelijk* back doet dan krijg je geen popup.
		if (this.type=='text' || this.type=='password') {
		
			//workaround voor oude browsers:
			// bind het 'input' event EN de keydown, en zet in het input event de keydown handler uit.
			
			$(this).bind('input', function() {
				$(this).unbind('keydown',_idd_formChangedWindowOnBeforeUnload);
				_idd_formChangedWindowOnBeforeUnload();
			});
			$(this).keydown(_idd_formChangedWindowOnBeforeUnload);
			
		} else {
			//submit, radio, etc.
			$(this).change(_idd_formChangedWindowOnBeforeUnload);
		}
	});
	
	$("textarea:not(.noLeavePageWarning)").each( function() { 
		$(this).bind('input', function() {
			$(this).unbind('keydown',_idd_formChangedWindowOnBeforeUnload);
			_idd_formChangedWindowOnBeforeUnload();
		});
		$(this).keydown(_idd_formChangedWindowOnBeforeUnload);
	});
	
	$("select:not(.noLeavePageWarning)").each( function() { 
			$(this).change(_idd_formChangedWindowOnBeforeUnload);
	});
	
	//en die wissen we weer als submit ingedrukt wordt
	$("form").each( function() {
		$(this).submit( function() { 
			$(window).unbind('beforeunload',_idd_formChangedReturnMessage);
		});
	});
}

//eerst unbinden voor de bind zodat je niet steeds dezelfde eventhandler attached
// http://stackoverflow.com/questions/1236067/test-if-event-handler-is-bound-to-an-element-in-jquery
function _idd_formChangedWindowOnBeforeUnload() {
	$(window).unbind('beforeunload',_idd_formChangedReturnMessage).bind('beforeunload',_idd_formChangedReturnMessage);
}


//firefox negeert de meegegeven tekst, IE kan niet overweg met extra parameters
// dus dit is de statische functie voor de waarschuwing als je een pagina verlaat zonder te saven
//
function _idd_formChangedReturnMessage() {
	return 'The changes you made will be lost when you navigate away from this page';
}

