/**
*
* Vindue klasse
*
* @version $Id$
* @copyright 2009 Stephan Stephens Stausholm - Madskillz.dk
*
* Denne klasse skal kun instantieres een gang, derefter ændres nødvendige parametre
* og visVindue() kaldes
*
* objektetets handle skal være winhandle, da jeg ikke har fundet en dynamisk måde at kalde this.luk externt
*
* prefixes
* e - Html element
* _ - Intern variabel
*
**/
  var win_global = this; // global scope reference
function Vindue() {

	/* Interne variable */
	this._vindueTimeout;
	this._IE6Frame;

	/* Elementerne der bruges til styring af vinduet */
	this.eContainer			= document.getElementById('vindue');				//placering af vinduet
	this.eSkygge			= document.getElementById('vindueSkygge');
	this.eOverskrift		= document.getElementById('vindueOverskrift');
	this.eOverskriftTekst	= document.getElementById('vindueOverskriftTekst');
	this.eIndhold			= document.getElementById('vindueIndhold');			// container til indholdet.
	this.eBoks				= document.getElementById('vindueBoks');			// boksen under overskriften
	this.eVindueBund 		= document.getElementById('vindueBund');
	this.eVindueTop 		= document.getElementById('vindueTop');
	this.eModal				= document.getElementById('vindueModal');

	/* Disse attributter ændrer sig per vindue */
	this.titel;
	this.besked;
	this.hoejde;
	this.bredde;
	this.eElement;					// Elementet der blev klikket på, her vises vinduet udfor


	/* vinduets parametre */
	this.modalfarve		= false;
	this.baggrundsfarve	= false;
	this.vinduefarve	= false;
	this.padding		= false;
	this.posTop			= false;
	this.posLeft		= false;
	this.center			= true;
	this.modal			= false;
	this.timeout		= false;
	this.executeOnload	= false;
	this.knapOk			= false;
	this.knapLuk		= false;
	this.knapAnuller	= false;
	this.knap3			= false;
	this.effektFade 	= true;		// Fade ind / ud effekten er slået til som standdard
	this.effektScroll	= false;	// horsontal scroll-in er disabled
	this.magicResize	= true;
	this.isDragable		= false;
	this.overFlowY		= 'auto';



	/* Lille bugfix til IE 6 og lavere der sørger for at select elementer ikke bliver rendered ovenpå vinduet */
	try{ var temp = document.getElementById('ie6BugfixIframe').src; } catch(e){}
	if (typeof(temp) == 'string')
		this._IE6Frame = document.getElementById('ie6BugfixIframe');
	else
		this._IE6Frame = false;

	/***
	*
	* Færdig med objektets construktion, nedenfor følger metoderne
	*
	***/

	/* Viser vinduet med de nuværende parametre */
	this.vis = function (){

		clearTimeout(this._vindueTimeout);

		setStoerrelse(this.bredde, this.hoejde,false);
		/*
		if (navigator.userAgent.indexOf('MSIE') > -1) // mja, funktionen virker ikke så godt med IE 8 så derfor slår jeg den bare fra.
			this.effektFade = false;
		*/
		if (this.executeOnload){
		eval(this.executeOnload);
	}


		if (this.center || this.modal || typeof(this.eElement) != 'object') {

			this.eContainer.style.left			= ((f_clientWidth() -this.bredde + 5)/2)+f_scrollLeft()+'px';
			this.eContainer.style.top			= ((f_clientHeight()-this.hoejde + 6)/2)+f_scrollTop()+'px';

			if( parseInt(this.eContainer.style.top) < 5 )
				this.eContainer.style.top		='15px';
			if( parseInt(this.eContainer.style.left) < 5 )
				this.eContainer.style.left		='15px';
		}

		else { // virker ikke endnu

			if (this.posTop != undefined && this.posLeft != undefined && this.posTop != '' && this.posLeft != ''){
				this.eContainer.style.left		= this.posLeft +'px';
				this.eContainer.style.top		= this.posTop +'px';
			}
			else{
				var elementPos 					= findPos(element);
				this.eContainer.style.left		= elementPos[0] - this.bredde + 5 +'px';
				this.eContainer.style.top		= elementPos[1] - this.hoejde + 6 +'px';
			}
			if (parseInt(this.eContainer.style.left) <= 5)
				this.eContainer.style.left 		= 5+'px';
			if (parseInt(this.eContainer.style.top) < 35)
				this.eContainer.style.top 		= 35+'px';

			if ((parseInt(this.eContainer.style.left) + this.bredde) > f_clientWidth())
				this.eContainer.style.left 		= f_clientWidth()-this.bredde + 100+'px';
			if ((parseInt(this.eContainer.style.top)  + this.hoejde) > f_clientHeight())
				this.eContainer.style.top 		= f_clientHeight()-this.hoejde + 100+'px';

		}

	/* Tilføj knapper til vinduet */

	//Fjern gamle knapper
	this.eVindueBund.innerHTML = '';
	this.eVindueTop.setAttribute('onclick','');

	if (this._IE6Frame) {		// typeof(iframe) == 'object'
			this.eVindueTop.onmouseover	= new Function ('this.className = \'vindueKnapIE6Hover\'');
			this.eVindueTop.onmouseout	= new Function ('this.className = \'vindueKnap\'');
	}

	if (this.knapOk instanceof Array) 		this.knapOk['titel']?this.tilfoejKnap('knapOk',this.knapOk['titel'], this.knapOk['onclick']):'';
	else 									this.tilfoejKnap('knapOk','&nbsp;Ok&nbsp;', 'winhandle.luk();');

	if (this.knapLuk instanceof Array) 		this.eVindueTop.onclick = new Function (this.knapLuk['onclick']);
	else									this.eVindueTop.onclick = new Function ('winhandle.luk()');

	if (this.knapAnuller instanceof Array) 	this.knapAnuller['titel']?this.tilfoejKnap('knapAnuller',this.knapAnuller['titel'], this.knapAnuller['onclick']):'';

	if (this.knap3 instanceof Array) 		this.knap3['titel']?this.tilfoejKnap('knap3',this.knap3['titel'], this.knap3['onclick']):'';

	/* Lille bugfix til IE 6 og lavere der sørger for at select elementer ikke bliver rendered ovenpå vinduet */
	if (this._IE6Frame){
	this._IE6Frame.style.top 	= this.eContainer.style.top;
	this._IE6Frame.style.left 	= this.eContainer.style.left;
	this._IE6Frame.style.width	= this.bredde + 5+'px';
	this._IE6Frame.style.height	= this.hoejde + 6+'px';
	this._IE6Frame.style.display= 'block';
	}

	this.eOverskriftTekst.innerHTML	= this.titel;
	/* dette er et hack i min dejlige klasse for at kunne vise loader når der hentes med Ajax */
	if (this.besked.indexOf('content') == 0)
		this.eIndhold.innerHTML 		= '<br /><br /><span style="padding-left:230px;">Henter indhold...</span><br /><img style="margin: 0 auto; display:block; vertical-align:middle;" src="gfx/loader.gif" alt="Indl&aelig;ser...">';
	else
		this.eIndhold.innerHTML 		= this.besked;

	if (this.modalfarve)
		this.eModal.style.backgroundColor = this.modalfarve;
	if (this.baggrundsfarve)
		this.eIndhold.style.backgroundColor = this.baggrundsfarve;
	if (this.vinduefarve)
		this.eBoks.style.backgroundColor = this.vinduefarve;
	if (this.padding)
		this.eIndhold.style.padding = this.padding;


	if (this.modal)
		this.visModal();
	else if (this.effektFade)
		this.fadein();
	else
		this.eContainer.style.display = 'block';

	if (this.timeout > 0 ){
		var _self = this;
		this._vindueTimeout = setTimeout(function(){_self.luk();},timeout);
	}

	if(this.magicResize && this.executeOnload == false)
		magicResize();
	/*
	* Alle attributter ryddes
	*/

	/* Disse attributter ændrer sig per vindue */
	this.titel 	= '';
	this.besked	= '';
	this.hoejde	= 200;
	this.bredde	= 300;
	this.eElement = '';					// Elementet der blev klikket på, her vises vinduet udfor

	this.eIndhold.style.overflowY = this.overFlowY;

	/* vinduets parametre */
	this.modalfarve		= '#000000';
	this.baggrundsfarve	= '#f1e9ff';
	this.vinduefarve	= '#f1e9ff';
	this.padding		= '3px';
	this.posTop			= false;
	this.posLeft		= false;
	this.center			= true;
	this.modal			= false;
	this.timeout		= false;
	this.executeOnload	= false;
	this.knapOk			= false;
	this.knapLuk		= false;
	this.knapAnuller	= false;
	this.knap3			= false;
	this.effektFade 	= true;		// Fade ind / ud effekten er slået til som standdard
	this.effektScroll	= false;	// horsontal scroll-in er disabled
	this.isDragable		= false;
	this.magicResize	= true;
	this.overFlowY		= 'auto';

//	setTimeout(function(){_self.luk();},timeout);

}; // visVindue slut

	/* opdaterer indholdet i nuværende vindue */
	this.opdaterIndhold = function(indhold){
		this.eIndhold.innerHTML = indhold;
	}; // opdaterindhold slut

	/* Indsætter et html element i indholds boksen */
	this.indsaetElement = function(element){
		this.eIndhold.innerHTML = '';
		this.eIndhold.appendChild(element);
	}; // indsaetElement slut



	/* Laver den lækre fadin effect */
	this.fadein = function() {


		this.eContainer.style.display = 'block';
		if (navigator.userAgent.indexOf('MSIE') > -1){ // mja, funktionen virker ikke så godt med IE 8 så derfor slår jeg den bare fra.
			setOpacity(10);
			return true;
		}
		for (i=0; i<11; i+=2)
			setTimeout('setOpacity('+i+')',10*i);

		return false;
	}; // fadein slut

	/* Fader vinduet ud*/
	this.fadeout = function() {
		if (navigator.userAgent.indexOf('MSIE') > -1){ // mja, funktionen virker ikke så godt med IE 8 så derfor slår jeg den bare fra.
			this.display(false);
			return true;
		}

		var _self = this;

		for (var i=11;i>0;i-=2){
			if (i != 1)
				setTimeout('setOpacity('+i+')',10*(11-i));
			else
				setTimeout(function(){_self.display(false);},10*(11-i));
		}
		return false;
	}; // fadeout slut



	/* viser eller skjuler vinduet fuldstændigt */
	this.display = function(vis) {
		this.eContainer.style.display = vis?'block':'none';

		/* Lille bugfix til IE 6 og lavere der sørger for at select elementer ikke bliver rendered ovenpå vinduet */
		if (this._IE6Frame) // du bruger ie6, og der skal bugfixes
			this._IE6Frame.style.display= vis?'block':'none';

		if (vis)
			this.visModal();
		else
			this.lukModal();
	}; //display slut


	/* Opdater en knap på boksen */
	this.opdaterKnap = function(knapId, title, onclick){
		var knap = document.getElementById('vindueKnap'+knapId);
		if (typeof(knap) == 'undefined')
			return false;

		knap.innerHTML = title;
		if (onclick != undefined && onclick != '')
			knap.onclick = new Function (onclick);
	}


	/* Tilføjer en knap til vinduet*/
	this.tilfoejKnap = function(knap, titel, onclick, klasse) {


		if (typeof(klasse) == 'undefined' || klasse == '') {
			klasse = 'vindueKnap';
		}

		var tempKnap = document.getElementById('vindueKnap'+knap);
	//	if (typeof(tempKnap) != 'undefined')
	//		this.opdaterKnap(knap, titel, onclick);

	  	var nyKnap 		= document.createElement('span');
	  	nyKnap.setAttribute('class',klasse);	// standards compliant
		nyKnap.setAttribute('className',klasse);	// IE er speciel

		nyKnap.setAttribute('id','vindueKnap'+knap);	// standards compliant

		if (onclick != undefined && onclick != '')
			nyKnap.onclick = new Function (onclick);

		/* ie understøtter ikke hover pseudo klasser på andet end A elementer */
		if (this._IE6Frame) {
			nyKnap.onmouseover	= new Function ('this.className = \'vindueKnapIE6Hover\'');
			nyKnap.onmouseout	= new Function ('this.className = \'vindueKnap\'');
		}

	  nyKnap.innerHTML = titel;
	  this.eVindueBund.appendChild(nyKnap);
	}; // TilfoejKnap slut


	this.luk = function() {
		this.fadeout();

		/* Lille bugfix til IE 6 og lavere der sørger for at select elementer ikke bliver rendered ovenpå vinduet */
		if (this._IE6Frame) // du bruger ie6, og der skal bugfixes
			this._IE6Frame.style.display='none';

		this.lukModal();
	}; // luk slut



	this.visModal = function(erRefresh,clearTimer) {

		if (erRefresh && this.eModal.style.display == 'none')
			return false;

		if (typeof(window.pageYOffset) != 'undefined')
			scrollTop = window.pageYOffset;
		else if (typeof(document.documentElement.scrollTop) != 'undefined')
			scrollTop = document.documentElement.scrollTop;
		else if (typeof(document.body.scrollTop) != 'undefined')				// document.documentElement.scrollTop er standard men dette er IE6
			scrollTop = document.body.scrollTop;

		if (erRefresh != true)
			setOpacity(0.1);

		this.eContainer.style.display = 'block';

		/* Lille bugfix til IE 6 og lavere der sørger for at select elementer ikke bliver rendered ovenpå vinduet */
		if (this._IE6Frame){
		//this._IE6Frame.style.top 	= this.eContainer.style.top;
		//this._IE6Frame.style.left 	= parseInt(this.eContainer.style.left)-5+'px';
		//this._IE6Frame.style.width	= this.eContainer.offsetWidth +'px';
		//this._IE6Frame.style.height	= this.eContainer.offsetHeight+'px';
		this._IE6Frame.style.display= 'block';
		this.eModal.style.left 		= 0+'px';
		this.eModal.style.top 		= scrollTop -100 +'px';
		this.eModal.style.width 	= f_clientWidth()+17+'px';
		this.eModal.style.height 	= f_clientHeight()+ 200 +'px';
		this.eContainer.style.left	= ((f_clientWidth() -this.eContainer.offsetWidth + 5)/2)+f_scrollLeft()+'px';
		this.eContainer.style.top	= ((f_clientHeight()-this.eContainer.offsetHeight + 6)/2)+f_scrollTop()-100+'px';
		this.eModal.style.display	= 'block';

		var _self = this;
		if (!clearTimer)
			clearTimeout(this._vindueTimeout);

		setTimeout(function(){_self.visModal(true)},100);

		}
		else{ // alle andre browsere behøver kun denne kodeblok

			this.eModal.style.width 	= f_clientWidth()+17+'px';
			this.eModal.style.height 	= screen.height+'px';
			//this.eModal.style.height 	= f_clientHeight()+'px';
			this.eContainer.style.left= ((f_clientWidth() -		this.eContainer.offsetWidth + 5)/2)+f_scrollLeft()+'px';
			this.eContainer.style.top	= ((f_clientHeight()-	this.eContainer.offsetHeight + 6)/2)+f_scrollTop()-100+'px';
			this.eModal.style.display	= 'block';

			var _self = this;
			if (!clearTimer)
				clearTimeout(this._vindueTimeout);

			setTimeout(function(){_self.visModal(true)},300);
		}

		if (erRefresh != true)
			this.fadein();
	}; //visModal slut

	/* opdaterer vinduets placering virker ikke med modal */
	this.reposition = function() {
		/* Lille bugfix til IE 6 og lavere der sørger for at select elementer ikke bliver rendered ovenpå vinduet */
		if (this._IE6Frame){
			this._IE6Frame.style.display= 'block';
			this.eContainer.style.left	= ((f_clientWidth() -this.eContainer.offsetWidth + 5)/2)+f_scrollLeft()+'px';
			this.eContainer.style.top	= ((f_clientHeight()-this.eContainer.offsetHeight + 6)/2)+f_scrollTop()-120+'px';
		}
		else{ // alle andre browsere behøver kun denne kodeblok
			this.eContainer.style.left= ((f_clientWidth() -		this.eContainer.offsetWidth + 5)/2)+f_scrollLeft()+'px';
			this.eContainer.style.top	= ((f_clientHeight()-	this.eContainer.offsetHeight + 6)/2)+f_scrollTop()-120+'px';
		}
	};

	this.lukModal = function() {
		this.eModal.style.display='none';
	};

} // vindue objekt slut


/*Resize*/

function magicResize(){
	eIndhold = document.getElementById('vindueIndhold');

	while (eIndhold.scrollHeight > eIndhold.clientHeight){
		var hoejde = parseInt(eIndhold.style.height)+74;
			if(hoejde > (f_clientHeight()-200)){
				winhandle.reposition();
				return;
				}

		setStoerrelse(0,hoejde+10,0);
	}

	/*

	Funktionen mangler stadig bund detection - så boksen ikke bliver længere end vinduet

	*/


}

/* Sætter størrelsen på nuværende vindue */
 var gammelHoejde;
 var gammelBredde;
 function setStoerrelse(bredde, hoejde, erResize){

	eSkygge			= document.getElementById('vindueSkygge');
	eOverskrift		= document.getElementById('vindueOverskrift');
	eIndhold		= document.getElementById('vindueIndhold');
	eBoks			= document.getElementById('vindueBoks');


	/* Tjekker at de givne størrelser er store nok */
	if (bredde != 0)
		bredde = (bredde<150)?150:bredde;
	hoejde = (hoejde<120)?120:hoejde;

	if (typeof(erResize) == 'undefined' || erResize == '' || erResize == 0)
		var erResize = false;

	if (erResize) {
		var counter = 1;
		for(i=parseInt(eIndhold.style.width)+ 18; i<=bredde; i+=8 ){
			setTimeout('setStoerrelse('+i+','+(i<=hoejde?i:hoejde)+',false)',counter*10);
			counter++;
		}

	} else {

		if (bredde != 0) {
			eOverskrift.style.width	= bredde - 10+'px';
			eBoks.style.width		= bredde - 10+'px';
			eIndhold.style.width	= bredde - 18+'px';
			eSkygge.style.width		= bredde + 5+'px';
		}
		eBoks.style.height		= hoejde - 34+'px';
		eIndhold.style.height	= hoejde - 74+'px';
		eSkygge.style.height	= hoejde + 6+'px';
		//winhandle.visModal(true,true);
	}

	winhandle.reposition(); // sørger for at vinduet står korrekt
} //setStoerrelse slut



/* Sætter gennemsigtigheden af vinduet - bruges til fade in/out */
 function setOpacity(value){
 	eContainer			= document.getElementById('vindue');				//placering af vinduet
	eSkygge				= document.getElementById('vindueSkygge');
	eBoks				= document.getElementById('vindueBoks');			// boksen under overskriften
	eVindueBund 		= document.getElementById('vindueBund');
	eVindueTop 			= document.getElementById('vindueTop');

	eContainer.style.opacity	= value/10;

	/* Der er en fejl et eller andet sted der gør at man ikke kan bruge opacity på containeren, men er nød til at fade hvert enkelt element */

	//eContainer.style.filter	= 'alpha(opacity=' + value*10 + ')';

	eSkygge.style.filter 		= 'alpha(opacity=' + ((value*10 < 80)?(value*10):80) + ')';
	eBoks.style.filter 		= 'alpha(opacity=' + value*10 + ')';
	eVindueBund.style.filter	= 'alpha(opacity=' + value*10 + ')';
	eVindueTop.style.filter 	= 'alpha(opacity=' + value*10 + ')';
 } //setOpacity slut

function findPos(obj) {
	if (obj == undefined)
		return false;
 var curleft = curtop = 0;
 if (obj.offsetParent) {
	curleft = obj.offsetLeft
	curtop = obj.offsetTop
	while (obj = obj.offsetParent) {
		curleft += obj.offsetLeft
		curtop += obj.offsetTop
	}
 }
 return [curleft,curtop];
 }

function f_clientWidth() {
	return f_filterResults (
		window.innerWidth ? window.innerWidth : 0,
		document.documentElement ? document.documentElement.clientWidth : 0,
		document.body ? document.body.clientWidth : 0
	);
}
function f_clientHeight() {
	return f_filterResults (
		window.innerHeight ? window.innerHeight : 0,
		document.documentElement ? document.documentElement.clientHeight : 0,
		document.body ? document.body.clientHeight : 0
	);
}
function f_scrollLeft() {
	return f_filterResults (
		window.pageXOffset ? window.pageXOffset : 0,
		document.documentElement ? document.documentElement.scrollLeft : 0,
		document.body ? document.body.scrollLeft : 0
	);
}
function f_scrollTop() {
	return f_filterResults (
		window.pageYOffset ? window.pageYOffset : 0,
		document.documentElement ? document.documentElement.scrollTop : 0,
		document.body ? document.body.scrollTop : 0
	);
}
function f_filterResults(n_win, n_docel, n_body) {
	var n_result = n_win ? n_win : 0;
	if (n_docel && (!n_result || (n_result > n_docel)))
		n_result = n_docel;
	return n_body && (!n_result || (n_result > n_body)) ? n_body : n_result;
}
