

String.prototype.supplant = function (o) { 
    return this.replace(/{([^{}]*)}/g, 
        function (a, b) {  
            var r = o[b];
            return typeof r === 'string' ? 
                r : a; 
        }
    ); 
}; 

function pageInit() {
	//YAHOO.util.Event.addListener('hovedmeny', "click", resizemeny);
	//resizemeny();
}

function vishjelp(navn) {
	var boks = document.getElementById("hlp" + navn);
	boks.style.visibility = "visible";
}

function skjulhjelp(navn) {
	var boks = document.getElementById("hlp" + navn);
	boks.style.visibility = "hidden";
}


function vedleggvindu() {
	var winVedlegg = window.open("dialog.php?dlg=filopplasting&action=vedlegg&new=true", "winvedlegg", "height=600,width=600,top=200,left=300,resizable=yes");

}

function filvindu(sMappeoid) {
	var winVedlegg = window.open("dialog.php?dlg=filopplasting&new=true&mappe="+sMappeoid, "winfil", "height=600,width=600,top=200,left=300,resizable=yes");

}

function addvedleggtoselect(sOid, sFilnavn) {
	var oSelect = opener.document.getElementById('vedlegg');
	var oOption = opener.document.createElement('option');
	oOption.value = sOid;
	oOption.text = sFilnavn;
	oSelect.appendChild(oOption);
}

function menymouseover(navn) {
	var elmt = document.getElementById(navn);
	elmt.style.backgroundColor = "#D1D8E5";
}

function menymouseout(navn) {
	var elmt = document.getElementById(navn);
	elmt.style.backgroundColor = "transparent";
}




function setCookie(c_name,value,expiredays)
{

var exdate=new Date();

exdate.setDate(expiredays)
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate)
}

function getCookie(c_name)
{
if (document.cookie.length>0)
  {
  c_start=document.cookie.indexOf(c_name + "=")
  if (c_start!=-1)
    { 
    c_start=c_start + c_name.length+1 
    c_end=document.cookie.indexOf(";",c_start)
    if (c_end==-1) c_end=document.cookie.length
    return unescape(document.cookie.substring(c_start,c_end))
    } 
  }
return null
}







/**
 * Function by Douglas Crockford to create a new object using an existing object as its prototype.
 * @param {object} objToClone Object to be used as prototype.
 * @return New object.
 * @type object
 */
function object(objToClone) {
    function F() {}
    F.prototype = objToClone;
    return new F();
}

/**
 * Defines namespace
 */
if (CCOMM === undefined) {
	var CCOMM = {};
}

/**
 * Defines a namespace in which to store objects need to be accessible.
 */
CCOMM.session = {};

/**
 * Container for person objects
 */
CCOMM.session.persons = {};

CCOMM.message = {};

CCOMM.structure = {};

CCOMM.engine = {};





/** 
 * A collection of various functions
 */
CCOMM.lib = {};



CCOMM.structure.fifoQueue = function() {
	var _iLength = 0;
	var _oFirstObj = null;
	var _oLastObj = null;
	return {
		add:		function(obj) {
			// Add new linkedListItem at the end of the Queue
			if (_iLength === 0) {
				var llItem = CCOMM.structure.linkedListItem(obj, null, null);
				_oFirstObj = llItem;
				_oLastObj = llItem;
			} else {
				var llItem = CCOMM.structure.linkedListItem(obj, _oLastObj, null);
				_oLastObj.next = llItem;
				_oLastObj = llItem;
			}
			_iLength++;
		},
		get:		function() {
			// Return the first linkedListItem and remove it from the Queue
			if (_iLength === 0) {
				return null;
			}
			oReturn = _oFirstObj;
			if (_iLength === 1) {
				_oFirstObj = null;
				_oLastObj = null;
			}
			if (_iLength > 1) {
				_oFirstObj = _oFirstObj.next;
				_oFirstObj.prev = null;
			}
			if (_iLength > 0) {
				_iLength--;
			}
			return oReturn.obj;
		},
		getLength:	function() {
			return _iLength;
		}
	};
	
};

CCOMM.structure.linkedListItem = function (obj, prev, next) {
	if (prev === undefined) { prev = null; }
	if (next === undefined) { next = null; }
	return {
		obj:	obj,
		prev:	prev,
		next:	next
	};
};


/**
 * @constructor
 */
CCOMM.engine.actionQueue = function() {
	var that =  {
		fifoQueue:		CCOMM.structure.fifoQueue(),
		add:			function (oFunction) {
			that.fifoQueue.add(oFunction);
		},
		doNext:			function () {
			var oFunction = that.fifoQueue.get();
			if (oFunction !== null) {
				oFunction();
			}
		}
	};
	return that;
};

/**
 * Name space
 */
CCOMM.person = {};

CCOMM.person.getByPids = function(aPids, fOnReady) {
	// Transform the container array of aPids to a jscon-string.
	// The callback saves the person object to CCOMM.session.persons.
	// If fOnReady is defined the callback calls fOnReady with an
	// collection object of the received person object as parameter. 
	// 
	this.fOnReady = fOnReady;
	var that = this;
		 
	/**
	 * @private
	 */
	var cbGetByPids = {
		success: function(oAjaxResponse) {
			
		}
	};
	
}

/**
 * Controller for changing password of user
 * @class
 * 
 */

CCOMM.person.changePassword = function(oPerson, bHookActionQueue) {
	var _oPerson;
	var _oDialog;
	
	function _save(e, obj) {
		// Parse values from form
		var sOldPw = YAHOO.util.Dom.get('chpw_oldpw').value;
		var sNewPw = YAHOO.util.Dom.get('chpw_newpw').value;
		var sNewPw2 = YAHOO.util.Dom.get('chpw_newpw2').value;
		// Check that sNewPw and sNewPw2 match. If not: show a message explaining this
		if (sNewPw != sNewPw2) {
			sErrMsg = 'Du skrev ikke inn det samme i "Nytt passord" og "Gjenta nytt"';
			var oMsg = CCOMM.util.message('chpw_msg_nomatch', 'Problem ved passordbytte', sErrMsg, false);
			oMsg.show();
			return false;
		}		
		var sUrl = "ajax.php?o=person"+_oPerson.pid+"&f=changePw";
		var sPost = "oldPw="+sOldPw+"&newPw="+sNewPw;
		var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, _cbSaved, sPost);
		
	}
	
	var _cbSaved = {
		success:	function(oAjaxResponse) {
			var oResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
			if (!oResponse['success']) {
				sErrMsg = oResponse['errmsg'];
				var oMsg = CCOMM.util.message('chpw_msg_error', 'Problem ved passordbytte', sErrMsg);
				oMsg.show();
				return false;
			}
			// The change was successfull
			sMsg = 'Passordet ditt er nå endret';
			_oDialog.hide();
		}
	};
	
	var that = {};
	
	// Constructor
	_oPerson = oPerson;
	if ((typeof bHookActionQueue) == "undefined") {
		_bHookActionQueue = false;
	} else {
		_bHookActionQueue = bHookActionQueue;
	}
	var sHeading = "Endre passord";
	var sExplanation = "<div style=\"margin-bottom: 18px\">Passordet du velger må bestå av minst 8 tegn. Det kan kun " +
			"inneholde små bokstaver (a-z), store bokstaver (A-Z) og tall (0-9). " +
			"Samtidig må det innholde minst &eacute;n liten bokstav, minst &eacute;n stor " +
			"bokstav og minst ett tall.</div>";
	var dForm = document.createElement("div");
	var sForm = '<form id="changepw_form" action="index.php" method="post">' +
		'<div class="enablecursor"><table class="form">' +
		'<tr>' +
		'<td class="label"><label for="oldpw">Gammelt passord:</label></td>' +
		'<td><input type="password" name="oldpw" id="chpw_oldpw" size="10"></td>' +
		'</tr>' +
		'<tr>' +
		'<td class="label"><label for="newpw">Nytt passord:</label></td>' +
		'<td><input type="password" name="newpw" id="chpw_newpw" size="10"></td>' +
		'</tr>' +	
		'<tr>' +
		'<td class="label"><label for="newpw2">Gjenta nytt:</label></td>' +
		'<td><input type="password" name="newpw2" id="chpw_newpw2" size="10"></td>' +
		'</tr>' +		
		'</table></div>' +
		'</form>';
	dForm.innerHTML = sForm;
	var aButtons = [];
	var oButtonCancel = CCOMM.control.iconButton("cancel"+_oPerson.pid, false, "close.png", 24);
	oButtonCancel.setAction("click", function () {_oDialog.hide();});
	aButtons.push(oButtonCancel);
	var oButtonSave = CCOMM.control.iconButton("save"+_oPerson.pid, false, "floppy_blue.png", 24);
	oButtonSave.setAction("click", _save);
	aButtons.push(oButtonSave);
	
	var oToolbar = CCOMM.control.toolBar("edit_toolbar"+_oPerson.pid, aButtons, 2, 0);
	
	_oDialog = CCOMM.util.dialog('changepw_dlg', sHeading, sExplanation, dForm, oToolbar.getEl(), _bHookActionQueue);
	_oDialog.setPanelProperty('width', '250px');
	_oDialog.show();
};

/**
 * @constructor
 */
CCOMM.person.entity = function(bExistingPerson, sJson) {

	function _closeDialog() {
		this.editDialog.hide();
	}
	
	
	/**
	 * Callback handler. Private method.
	 */
	_cbSaved = {
		success: function() {
		}
	}
	
	if (bExistingPerson) {
		var that = YAHOO.lang.JSON.parse(sJson);
	} else {
		var that = {
			pid:		0,
			detaildoc:	"",
			brnavn:		"",
			passord:	"",
			fnavn:		"",
			enavn:		"",
			tlfmob:		"",
			tlfhjem:	"",
			adresse:	"",
			sted:		"",
			postnr:		"",
			epost:		"",
			facebook:	"",
			image:		"",
			mayedit:	true
		};
	}
	
	that.save = function(fCallback) {
		that._fCallback = fCallback;
		var sUrl = "ajax.php?o=person"+that.pid+"&f=lagre";
		var sPost= "pid="+that.pid+
			"&fnavn="+encodeURIComponent(that.fnavn)+
			"&enavn="+encodeURIComponent(that.enavn)+
			"&tlfmob="+that.tlfmob+
			"&tlfhjem="+that.tlfhjem+
			"&adresse="+encodeURIComponent(that.adresse)+
			"&sted="+encodeURIComponent(that.sted)+
			"&postnr="+that.postnr+
			"&epost="+encodeURIComponent(that.epost)+
			"&facebook="+encodeURIComponent(that.facebook);
		var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, that.editDialog.cbSaved, sPost);
	};
	
	that.set = function(sAttr, sValue) {
		that[sAttr] = sValue;
	}
	
	that.validate = function(sAttr, sValue) {
		var bOk = true;
		var sErrmsg = "";
		switch (sAttr) {
			case "fnavn":
				// Er det satt et fornavn?
				var oRe = /\w+/;
				if (!oRe.test(sValue)) {
					bOk = false;
					sErrmsg = "Fornavn kan ikke være tomt.";
				}
				// Inneholder fornavn annet enn bokstaver, bindestrek og space?
				oRe = /[^ a-zæøåäö-]/i;
				if (oRe.test(sValue)) {
					bOk = false;
					sErrmsg = "Fornavn kan kun inneholde bokstaver og bindestrek.";
				}				
				break;
			case "enavn":
				// Er det satt et etternavn?
				var oRe = /\w+/;
				if (!oRe.test(sValue)) {
					bOk = false;
					sErrmsg = "Etternavn kan ikke være tomt.";
				}
				// Inneholder etternavn annet enn bokstaver og bindestrek?
				oRe = /[^ a-z������-]/i;
				if (oRe.test(sValue)) {
					bOk = false;
					sErrmsg = "Etternavn kan kun inneholde bokstaver og bindestrek.";
				}				
				break;	
			case "tlfmob":
				if (sValue.length == 0) break;
				var oRe = /\+?\d{8,10}/;
				if (!oRe.test(sValue)) {
					bOk = false;
					sErrmsg = "Mobiltelefon må ha 8-10 siffer.";
				}
				// Se etter andre tegn enn siffer og pluss
				oRe = /[^0-9\+]/;
				if (oRe.test(sValue)) {
					bOk = false;
					sErrmsg = "Mobiltelefon inneholder ugyldige tegn.";
				}
				break;
			case "tlfhjem":
				if (sValue.length == 0) break;
				var oRe = /^\+?\d{8,10}$/;
				if (!oRe.test(sValue)) {
					bOk = false;
					sErrmsg = "Hjemmetelefon må ha minst 8 til 10 siffer.";
				}
				// Se etter andre tegn enn siffer og pluss
				oRe = /[^0-9\+]/;
				if (oRe.test(sValue)) {
					bOk = false;
					sErrmsg = "Hjemmetelefon inneholder ugyldige tegn.";
				}
				break;
			case "adresse":
				if (sValue.length == 0) break;
				// Vet ikke om noen fornuftig sjekk her
				break;
			case "postnr":
				if (sValue.length == 0) break;
				var oRe = /^\d{4}$/;
				if (!oRe.test(sValue)) {
					bOk = false;
					sErrmsg = "Postnummer må bestå av 4 siffer.";
				}				
				break;				
			case "sted":
				if (sValue.length == 0) break;
				// legger ikke inn noen spesielle tester på stedsnavn
				break;	
			case "epost":
				if (sValue.length == 0) break;
				var oRe = /^[a-z0-9_\+\-\.]+\@[a-z0-9_\+\-]+\.[a-z0-9_\+\-\.]+$/i;
				if (!oRe.test(sValue)) {
					bOk = false;
					sErrmsg = "Epostadressen er ikke en gyldig epostadresse.";
				}				
				break;	
			case "facebook":
				if (sValue.length == 0) break;
				var oRe = /^(http\:\/\/www\.facebook.com\/profile.php\?id\=){1}\d{9}$/i;
				if (!oRe.test(sValue)) {
					bOk = false;
					sErrmsg = "Adressen til facebook-profilen er ikke gyldig.";
				}				
				break;		
			default: 
				bOk = true;
		}
		return {
			bOk:		bOk,
			sErrmsg:	sErrmsg
		}
	}  
	
	
	return that;
	
};

/**
 * Namespace object
 */
CCOMM.control = {};

/**
 * @param DOM-object dAttachTo DOM element to which the inlineEdit is attached
 * @param object oPassAlong Object that is passed along to the event handlers
 * @paraam integer iMinNumCars Minimal size of the input box in the inline edit panel
 */
CCOMM.control.inlineEdit = function(dAttachTo, oPassAlong, iMinNumChars) {
	// Declare private variabels
	var _dAttachTo;
	var _dContainingDiv;
	var _oPassAlong;
	var _sIdBase;
	var _oPanel;
	var _fOnSave;
	var _iMinNumChars;
	var _editType;
	
	// Declare public properties and methods
	var that = {
		/**
		 * Set the function to be called when the save button is clicked.
		 * @param function fOnSave The function to be called at save. This function 
		 * 		will be passed the value of the input box, the 'click' event and the object oPassAlong as parameters.
		 */
		setOnSave:	function(fOnSave) {
			_fOnSave = fOnSave;
		}
	};
	
	// Declare private functions
	
	/**
	 * Eventhandler. Fired when the Dom element dAttachTo is clicked
	 */
	function _openEditor(e, oPassAlong) {
		// construct panel
		// read from dAttachTo to fill the content of the input-box
		_dContainingDiv = document.createElement("div");
		_dContainingDiv.id = _sIdBase + 'container';
		YAHOO.util.Dom.get("misc").appendChild(_dContainingDiv);
		var oPanelCfg = {
			visible:		false,
			draggable:		false,
			close:			false,
			modal:			false,
			/*effect:			{ effect: YAHOO.widget.ContainerEffect.FADE, duration:0.05},*/
			fixedcenter:	false,
			/*width:			"200px",*/
			context:		[_dAttachTo, "tl", "tl"]
		};
		_oPanel = new YAHOO.widget.Panel(_dContainingDiv.id, oPanelCfg);
		var dPanelBody = document.createElement("div");
		var sCurrentvalue = _dAttachTo.innerHTML;
		var iNumChars = Math.max(sCurrentvalue.length, _iMinNumChars);
		if (iNumChars < 30) {
			// Use <input> if less than 30 chars
			_editType = 'input';
			var iNumCharsInput = iNumChars +5;
			var sHtml = '<input type="text" id="'+_sIdBase+'_input" size="'+iNumCharsInput+'" value="'+sCurrentvalue+'" />';
		} else {
			// If larger than 30 chars we use a <textarea>
			_editType = 'textarea';
			var iNumCols = 30;
			var temp = iNumChars / iNumCols;
			var iNumRows = Math.round((iNumChars / iNumCols) + 0.5);
			var sHtml = '<textarea id="'+_sIdBase+'_input" cols="'+iNumCols+'" rows="'+iNumRows+'">'+sCurrentvalue+'</textarea>'; 
		}
		dPanelBody.innerHTML = sHtml;
		// Create buttons
		var oCancelButton = CCOMM.control.iconButton(_sIdBase+'cancel', false, 'close.png', 16, 16);
		oCancelButton.setAction('click', _cancel);
		oCancelButton.setTooltip('Avbryt');
		var oSaveButton = CCOMM.control.iconButton(_sIdBase+"save", false, "floppy_blue.png", 16, 16);
		oSaveButton.setAction("click", _save, _oPassAlong);
		//oSaveButton.setAction('Lagre'); 
		var dButtonContainer = document.createElement("div");
		YAHOO.util.Dom.setStyle(dButtonContainer, 'text-align', 'right');
		dButtonContainer.appendChild(oCancelButton.oEl);
		dButtonContainer.appendChild(oSaveButton.oEl);
		// Create toolbar
		//var oToolBar = CCOMM.control.toolBar(_sIdBase+"toolbar", [oCancelButton, oSaveButton], 1, 0);
		dPanelBody.appendChild(dButtonContainer); 
		// Set content of panel
		_oPanel.setBody(dPanelBody);
		YAHOO.util.Dom.setStyle(_oPanel.body, 'padding', '2px');
		//YAHOO.util.Dom.addClass(_oPanel.body, 'inline_edit');
		_oPanel.render();
		_oPanel.show();
		// Move focus to the input field
		/* ccommbug Sometimes in FF the value of the input box is not shown until the user starts typing */
		YAHOO.util.Dom.get(_sIdBase+'_input').focus();
	}
	
	function _cancel(e, oPassAlong) {
		_oPanel.hide();
		_oPanel.destroy();
		_oPanel = undefined;
		// I have som problems where _dContainingDiv is not removed from the 'misc' DOM element
		// This is not a fast way to do this.
		while (dDivToRemove = YAHOO.util.Dom.get(_sIdBase + 'container')) {
			CCOMM.util.removeFromDom(dDivToRemove);
		}

	}
	
	/**
	 * Eventhandler. Executed when the save button is clicked. 
	 * @param event e Triggering event
	 * @param object oPassAlong Pass along object of the inline edit object
	 * @return void 
	 */
	function _save(e, oPassAlong) {
		// Retrieve the text from the edit box
		// Get DOM of input or textarea
		var dEditBox = YAHOO.util.Dom.get(_sIdBase+'_input');
		var sValue;
		if (_editType === 'input') {
			sValue = dEditBox.value;
		} else {
			sValue = dEditBox.value;
			
		}
		// Remove the panel object
		_dAttachTo.innerHTML = sValue;
		_oPanel.hide();
		_oPanel.destroy();
		_oPanel = undefined;
		// I have som problems where _dContainingDiv is not removed from the 'misc' DOM element
		// This is not a fast way to do this.
		while (dDivToRemove = YAHOO.util.Dom.get(_sIdBase + 'container')) {
			CCOMM.util.removeFromDom(dDivToRemove);
		}
		// Pass on the save event to a handler defined from outside
		if (_fOnSave !== undefined) {
			_fOnSave(sValue, e, oPassAlong);
		}
	}
	
	// Constructor
	_dAttachTo = dAttachTo;
	_oPassAlong = oPassAlong
	_sIdBase = _dAttachTo.id + '_inlineed_';
	if (iMinNumChars == undefined) {
		_iMinNumChars = 10;
	} else {
		_iMinNumChars = iMinNumChars;
	}
	YAHOO.util.Event.addListener(_dAttachTo, 'click', _openEditor);
	
	// Return instantiated object
	return that;
};

CCOMM.control.testClass = function(parameter) {
	/*
	 * Standard class setup:
	 * 1. Declare private variable. Prefix names with underscore.
	 * 2. Declare the object 'that' where the members are public properties and
	 *    methods of the instantiated object.
	 * 3. Declare private functions. Prefix names with underscore.
	 * 4. Do construction stuff.
	 * 5. return that
	 * 
	 * Notes: 
	 * The object 'that' can now be referenced from anywhere within the object.
	 * 
	 */
	// Class template: 
	
	// Declare private variabels
	var _param;
	// Declare public properties and methods
	var that = {
	};
	// Declare private functions
	function _priv() {}  
	// Constructor
	_priv();
	_param = "example string";
	// Return instantiated object	
	return that;
};

/**
 * @param 
 */
CCOMM.control.toolBar = function(sId, aButtons, iHorPadding, iVerPadding, iTopPadding) {
	var _oEl;
	var _aButtons = aButtons;
	return {
		sId: sId,
		iHorPadding: iHorPadding,
		iVerPadding: iVerPadding,
		iTopPadding: iTopPadding,
		getEl: function() {
			_oEl = document.createElement("div");
			_oEl.id = this.sId;
			YAHOO.util.Dom.addClass(_oEl, "ctl_toolbar");
			if (this.iTopPadding !== undefined) {
				YAHOO.util.Dom.setStyle(_oEl, 'padding-top', this.iTopPadding+'px');
			}
			
			for (var i=0; i<aButtons.length; i++) {
				var oButton = aButtons[i];
				var oSpan = document.createElement("span");
				var sPadding = this.iVerPadding+"px "+this.iHorPadding+"px "+this.iVerPadding+"px "+this.iHorPadding+"px";
				YAHOO.util.Dom.setStyle(oSpan, "padding", sPadding);
				_oEl.appendChild(oSpan);
				oSpan.appendChild(oButton.oEl);
			}
			return _oEl;
		}
	};
};


/**
 * Abstract class for implementations of buttons.
 * @class 
 * @constructor
 * @param {string} sId The id of the DOM element created by the object
 * @param {boolean} bFromMarkup Is the button to be created from existing markup?
 * @param {string} sType The type of the DOM element to act as a button
 */
CCOMM.control.button = function(sId, bFromMarkup, sType) {
	var oEl;
	if (bFromMarkup) {
		oEl = YAHOO.util.Dom.get(sId);
	} else {
		oEl = document.createElement(sType);
		oEl.id = sId;
	}

	return {
		sId: sId,
		bFromMarkup: bFromMarkup,
		oEl: oEl
	};
	
};

/**
 * Makes or constructs a button as an img.
 * @class
 * @extends CCOMM.control.button
 * @constructor
 * @param {string} sId ID of img-object to make into a button.
 * @param {boolean} bFromMarkup Is the button created from existing markup?
 * @param {string} sIcon Filename of icon to use when icon is neutral (i.e. not hovered over or clicked). The object assumes this icon is placed in "gfx/icons/"
 * @param {string} sDim Dimensions of the button on the form [#pixels width]x[#pixels heigth]
 * @ 
 */
CCOMM.control.iconButton = function (sId, bFromMarkup, sIcon, iWidth, iHeight) {
	var that = CCOMM.control.button(sId, bFromMarkup, "img");
	var _oTooltip;
	if (typeof iHeight !== "number") {
		iHeight = iWidth;
	}
	
	//paths of icons in different states
	var _aIconName = sIcon.split(".");
	var _sIconBaseName = _aIconName[0];
	var _sIconExt = "." + _aIconName[1];
	var _sIconPathNBase = "gfx/icons/" + _sIconBaseName;
	var _sIconNormal = _sIconPathNBase + "_" + iWidth + _sIconExt;
	var _sIconHover = _sIconPathNBase + "_" + iWidth + "_hover" + _sIconExt;
	
	// Initialize to normal state
	YAHOO.util.Dom.addClass(that.oEl, "ctl_button_normal");
	that.oEl.src = _sIconNormal;
	
	// Event handlers that dynamically changes appearence of button
	function _mouseover(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		dEventTarget.src = _sIconHover;
		YAHOO.util.Dom.replaceClass(dEventTarget, "ctl_button_normal", "ctl_button_hover");
		var dummy = true;
	}
	function _mouseout(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		dEventTarget.src = _sIconNormal;
		YAHOO.util.Dom.replaceClass(dEventTarget, "ctl_button_hover", "ctl_button_normal");
		var dummy = true;
	}
	
	function _mousedown(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		dEventTarget.src = _sIconNormal;;
		YAHOO.util.Dom.replaceClass(dEventTarget, "ctl_button_hover", "ctl_button_pushed");
		var dummy = true;
	}
	
	function _mouseup(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		dEventTarget.src = _sIconHover;
		YAHOO.util.Dom.replaceClass(dEventTarget, "ctl_button_pushed", "ctl_button_hover");
		var dummy = true;
		// If tooltip has been shown, hide it now
		if (_oTooltip !== undefined) {
			_oTooltip.hide();
		}
		
	}
	
	// Assign event handlers to events
	YAHOO.util.Event.addListener(that.oEl, "mouseover", _mouseover);
	YAHOO.util.Event.addListener(that.oEl, "mouseout", _mouseout);
	YAHOO.util.Event.addListener(that.oEl, "mousedown", _mousedown);
	YAHOO.util.Event.addListener(that.oEl, "mouseup", _mouseup);
	
	/**
	 * Public method that assigns an event handler to the img-object of the iconButton 
	 */
	that.setAction = function(sEvent, oFunction, oObj) {
		YAHOO.util.Event.addListener(that.sId, sEvent, oFunction, oObj);
	};
	
	/**
	 * Public method to create a tooltip associated with the button.
	 * @member CCOMM.control.iconButton
	 * @param {string} sTooltipText The text content of the tooltip
	 * @return
	 * @type void
	 */
	that.setTooltip = function(sTooltipText) {
		if (typeof _oTooltip == "undefined") {
			sTooltipId = that.sId + "_tooltip";
			_oTooltip = new YAHOO.widget.Tooltip(sTooltipId, {  
	    		context: that.oEl,  
	    		text: sTooltipText, 
	    		showDelay: 600 } );
		} else {
			// Setter text property for attributt. Tror noe mer må til for at den skal rendere dette.
			_oTooltip.text(sTooltipText);
		}
	};
	return that;
	
};

CCOMM.control.imgButton = function (sId, bFromMarkup, sImgNormal, sImgHover, sImgPushed) {
	var that = CCOMM.control.button(sId, bFromMarkup, "img");
	var _oTooltip;
	
	
	// Initialize to normal state
	YAHOO.util.Dom.addClass(that.oEl, "ctl_imgbutton_normal");
	that.oEl.src = sImgNormal;
	
	// Event handlers that dynamically changes appearence of button
	function _mouseover(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		dEventTarget.src = sImgHover;
		YAHOO.util.Dom.replaceClass(dEventTarget, "ctl_imgbutton_normal", "ctl_imgbutton_hover");
		var dummy = true;
	}
	function _mouseout(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		dEventTarget.src = sImgNormal;
		YAHOO.util.Dom.replaceClass(dEventTarget, "ctl_imgbutton_hover", "ctl_imgbutton_normal");
		var dummy = true;
	}
	
	function _mousedown(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		dEventTarget.src = sImgPushed;;
		YAHOO.util.Dom.replaceClass(dEventTarget, "ctl_imgbutton_hover", "ctl_imgbutton_pushed");
		var dummy = true;
	}
	
	function _mouseup(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		dEventTarget.src = sImgHover;
		YAHOO.util.Dom.replaceClass(dEventTarget, "ctl_imgbutton_pushed", "ctl_imgbutton_hover");
		var dummy = true;
		// If tooltip has been shown, hide it now
		if (_oTooltip !== undefined) {
			_oTooltip.hide();
		}
		
	}
	
	// Assign event handlers to events
	YAHOO.util.Event.addListener(that.oEl, "mouseover", _mouseover);
	YAHOO.util.Event.addListener(that.oEl, "mouseout", _mouseout);
	YAHOO.util.Event.addListener(that.oEl, "mousedown", _mousedown);
	YAHOO.util.Event.addListener(that.oEl, "mouseup", _mouseup);
	
	/**
	 * Public method that assigns an event handler to the img-object of the iconButton 
	 */
	that.setAction = function(sEvent, oFunction, oObj) {
		YAHOO.util.Event.addListener(that.sId, sEvent, oFunction, oObj);
	};
	
	/**
	 * Public method to create a tooltip associated with the button.
	 * @member CCOMM.control.iconButton
	 * @param {string} sTooltipText The text content of the tooltip
	 * @return
	 * @type void
	 */
	that.setTooltip = function(sTooltipText) {
		if (typeof _oTooltip == "undefined") {
			sTooltipId = that.sId + "_tooltip";
			_oTooltip = new YAHOO.widget.Tooltip(sTooltipId, {  
	    		context: that.oEl,  
	    		text: sTooltipText, 
	    		showDelay: 600 } );
		} else {
			// Setter text property for attributt. Tror noe mer må til for at den skal rendere dette.
			_oTooltip.text(sTooltipText);
		}
	};
	return that;
	
};


/**
 * @constructor
 * @extends CCOMM.control.iconButton
 */
CCOMM.control.helpButton = function(sId, bFromMarkup, sHelpText, sHelpHeading) {
	// Establish inheritance
	var that = CCOMM.control.iconButton(sId, bFromMarkup, "help.png", 16, 16);
	var _sHelpText = sHelpText;
	var _sHelpHeading = sHelpHeading;
	var _oPanel;
	that.setAction("click", _showHelp);
	that.getEl = function() {
		return that.oEl;
	};
	_build();
	
	that.setHelpText = function(sHelpText) {
		_sHelpText = sHelpText;
		_build();
	}
	
	that.setHelpHeading = function(sHelpHeading) {
		_sHelpHeading = sHelpHeading;
		_build();
	}
	
	function _build() {
		var _oPanelCfg = {
			visible:	false,
			draggable:	true,
			close:		true,
			modal:		false,
			effect:		{ effect: YAHOO.widget.ContainerEffect.FADE, duration:0.25},
			x:			100, //e.clientX - 20,
			y:			100, //e.clientY + 20,
			width:		"100px"
		};
		// Create Panel object
		var oContainingDiv = document.createElement("div");
		oContainingDiv.id = "helppanel_"+sId;
		YAHOO.util.Dom.get("misc").appendChild(oContainingDiv);
		_oPanel = new YAHOO.widget.Panel("helppanel_"+sId, _oPanelCfg);
		// Build the content of the Help Panel
		var _oPanelBody = document.createElement("div");
		var _oHelpText = document.createElement("div");
		_oHelpText.innerHTML = _sHelpText;
		_oPanelBody.appendChild(_oHelpText);
		// Create and and ok-button
		var _oToolbar = document.createElement("div");
		YAHOO.util.Dom.addClass(_oToolbar, "ctl_toolbar");
		_oHelpText.appendChild(_oToolbar);
		var _oOkButton = CCOMM.control.iconButton("helppanel_"+sId+"_close", false, "accept.png", 24, 24);
		_oOkButton.setAction("click", function() {_oPanel.hide();});
		_oToolbar.appendChild(_oOkButton.oEl);
		// Set the content of the panel
		_oPanel.setHeader(_sHelpHeading);
		_oPanel.setBody(_oPanelBody);
		_oPanel.render();
	}
	/**
	 * Eventhandler called when the help button is clicked.
	 * Create and show a help panel.
	 */
	function _showHelp(e, obj) {
		// Configuration of Help Panel
		_oPanel.cfg.setProperty("x", e.clientX+20);
		_oPanel.cfg.setProperty("y", e.clientY-40)
		_oPanel.show();
	}
	


	return that;
};



/**
*	Henter ut alle noder av xml-document sXML av type nodename.
*	@param {string} sXML XML-document (som tekst) som skal parses
*	@param {string} nodename navn p� xml-noder som skal hentes ut
*	@return Array med et objekt for hver node av type nodename. Hvert objekt har par av attributt-navn og attributt-verdier
*	@type Array
*/
CCOMM.xml2objs = function (sXML, nodename) {
	var oResult = new Array();
	// Bruk zXmlDom som container og parser av objetk
	// lag xmldom og last inn xml
	var oXmlDom =zXmlDom.createDocument();
	oXmlDom.loadXML(sXML);
	var oRoot = oXmlDom.documentElement;
	// Velg ut alle noder av �nsket type. Finn alle attributtene i disse
	var aNodes = oRoot.getElementsByTagName(nodename);
	for (var i = 0; i < aNodes.length; i++) {
		var oNode = aNodes[i];
		var curElement = {};
		for (var j = 0; j < oNode.attributes.length; j++) {
			curAttr = oNode.attributes[j];
			curElement[curAttr.nodeName] = curAttr.nodeValue;
		}
		oResult[i] = curElement;
	}
	return oResult;		
}

CCOMM.mainContent = {};


CCOMM.mainContent.pageLoader = function() {

	// Declare private variabels
	var _sCurrentPage;
	var _oContactController;
	// Declare public properties and methods
	var that = {
		getPage:		function(pageId) {
			var sUrl = "ajax.php?o=pagefetcher&f=getpage";
			var sPost = "pageid="+pageId;
			var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, _receivePage, sPost);	
		}
	};
	// Declare private functions
	function _stateChangeHandler(newpage) {
		console.log('state change handler');
		if (newpage != _sCurrentPage) {
			that.getPage(newpage);
		}
	}
	
	var _receivePage = {
		success: function(oAjaxResponse) {
			var oPage = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
			var dMaincontent = YAHOO.util.Dom.get('wgt_maincontent');
			dMaincontent.innerHTML = oPage.content;
			CCOMM.data.metaData = oPage.metadata;
			CCOMM.widgetLoader.runLocal('wgt_maincontent');
			_oContactController.runLocal('wgt_maincontent');
			// Tell browser history manager that the state has changed
			_sCurrentPage = CCOMM.data.metaData.pageid.toString();
			YAHOO.util.History.navigate("pageLoader", _sCurrentPage);
		},
		failure: function (oAjaxResponse) {}
	}; 
	
  

	// Constructor
	_sCurrentPage = CCOMM.data.metaData.pageid.toString();
	_oContactController = CCOMM.lib.contactController();
	// Browser history manager
	YAHOO.util.History.register("pageLoader", _sCurrentPage, _stateChangeHandler); 
	// Make this object globally available
	CCOMM.session.pageLoader = that;
};


/**
 * @constructor
 */
CCOMM.mainMenu = function() {
	function _toggleExpanded(e, obj) {
		if (obj.clickedItem == "icon") {
			YAHOO.widget.TreeView.getNode('main_menu', obj.nodeNum).toggle();
		}
		var clickedIcon = YAHOO.util.Dom.get("ygtvt"+obj.nodeNum+"r");
		/* @CCOMMTODO Må her bruke lignende algoritme som i _selectLink for å ikke ende opp med minusknapp p� steder der det skulle v�rt plussknapp. */
		if (YAHOO.util.Dom.hasClass(clickedIcon, "ygtvtmr")) {
			YAHOO.util.Dom.replaceClass(clickedIcon, "ygtvtmr", "ygtvtpr");
		} else {
			YAHOO.util.Dom.replaceClass(clickedIcon, "ygtvtpr", "ygtvtmr");
		}
		// Loop through all nodes to see if an icon should change from "ygtvmr" to "ygtvtpr"
		var aAllNodes = obj.tree._nodes;
		
		for (var i=0; i<aAllNodes.length; i++) {
			if ((typeof aAllNodes[i]) == "undefined") {
				continue;
			}
			var oNode = aAllNodes[i];
			// Is the node currently expanded?
			var bExpanded = oNode.expanded;
			// If not expanded, make sure the icon is � "+"
			if (!bExpanded) {
				sTrId = "ygtvt" + oNode.index + "r";
				var oCollapsedIconTd = YAHOO.util.Dom.get(sTrId);
				if (oCollapsedIconTd) {
					if (YAHOO.util.Dom.hasClass(oCollapsedIconTd, "ygtvtmr")) {
						YAHOO.util.Dom.replaceClass(oCollapsedIconTd, "ygtvtmr", "ygtvtpr");
					}
				}
			}
		}
	}
	
	function _highLightBgStart (e, obj) {
		YAHOO.util.Dom.setStyle(obj, "background-color", style_menu_highlight_color);
	};

	function _highLightBgStop(e, obj) {
		YAHOO.util.Dom.setStyle(obj, "background-color", "");
	};
	var _loadMenu = {
		success: function(oAjaxResponse) {
			var aRawNodes = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
			_buildMenu(aRawNodes);
			
			
	  	}
	
	};
	
	function _buildMenu(aRawNodes) {
	  		// Opprett div-element som skal inneholde TreeView-objekt
	  		var divMainMenu = document.createElement("div");
	  		divMainMenu.id = "main_menu";
	  		YAHOO.util.Dom.get("wgt_mainmenu").appendChild(divMainMenu);
	  		
	  		// Init TreeView-objekt
	  		var menuTree = new YAHOO.widget.TreeView("main_menu");
			// Opprett array som skal inneholde alle nodene til menuTree
			var aNodes = [];
			aNodes[0] = menuTree.getRoot();
			for (var i=0; i<aRawNodes.length; i++) {
				var oRawNode = aRawNodes[i];
				var oNodeData = {
					label: 		oRawNode.tekst,
					oid: 		oRawNode.oid,
					url:		oRawNode.url
				}
				// Opprett node til menytreet
				var newNode = new YAHOO.widget.MenuNode(oNodeData, aNodes[oRawNode.nodeparent], oRawNode.nodeexpanded);
				aNodes[oRawNode.oid] = newNode;
				// Override default setting for YAHOO.widget.Node, so that all nodes in the tree is rendered at load.
				// This is necessary to ensure plus and minus buttons are correct.
				aNodes[oRawNode.oid].renderHidden = true;
			}
			
			menuTree.draw();
			// _selectLink skal kalles når det trykkes på en link
			menuTree.subscribe("labelClick", _selectLink);
			
			// Testopplegg for å legge til en td i slutten av passende linker
			var aCollapsable =YAHOO.util.Dom.getElementsByClassName("ygtvtm", "td", "main_menu");
			for (var i = 0; i < aCollapsable.length; i++) {
				var tdLeft = aCollapsable[i];
				var nodeNum = tdLeft.id.substring(5);
				var tdRight = document.createElement("td");
				tdRight.id = "ygtvt" + nodeNum + "r";
				YAHOO.util.Dom.addClass(tdRight, "ygtvtmr");
				YAHOO.util.Event.addListener(tdRight, "click", _toggleExpanded, {nodeNum: nodeNum, clickedItem: "icon", tree: menuTree});
				var labelEl = YAHOO.util.Dom.get("ygtvlabelel"+nodeNum);
				YAHOO.util.Event.addListener(labelEl, "click", _toggleExpanded, {nodeNum: nodeNum, clickedItem: "label", tree: menuTree});
				aCollapsable[i].parentNode.appendChild(tdRight);
			}
			
			// Legger til en td i slutten av passende linker, for å få til '+' og '-' knapper når en link har en undermenu
			var aExpandable =YAHOO.util.Dom.getElementsByClassName("ygtvtp", "td", "main_menu");
			for (var i = 0; i < aExpandable.length; i++) {
				var tdLeft = aExpandable[i];
				var nodeNum = tdLeft.id.substring(5);
				var tdRight = document.createElement("td");
				tdRight.id = "ygtvt" + nodeNum + "r";
				YAHOO.util.Dom.addClass(tdRight, "ygtvtpr");
				YAHOO.util.Event.addListener(tdRight, "click", _toggleExpanded, {nodeNum: nodeNum, clickedItem: "icon", tree: menuTree});
				var labelEl = YAHOO.util.Dom.get("ygtvlabelel"+nodeNum);
				YAHOO.util.Event.addListener(labelEl, "click", _toggleExpanded, {nodeNum: nodeNum, clickedItem: "label", tree: menuTree});
				aExpandable[i].parentNode.appendChild(tdRight);
			}
			
			// Koble onmouseover og onmouseout-events til hver tabell (dvs, hver rad) i menyen,
			// slik at bakgrunnen blir highlighted
			var aTables = YAHOO.util.Dom.getElementsBy(function (el) { return true; }, "table", "main_menu")
			for (var i = 0; i < aTables.length; i++) {
				YAHOO.util.Event.addListener(aTables[i], "mouseover", _highLightBgStart, aTables[i]);
				YAHOO.util.Event.addListener(aTables[i], "mouseout", _highLightBgStop, aTables[i]);
			}
	};
	/**
	 * Eventhandler. Private method. Gets called when a link in the menu is clicked.
	 * @param {object MenuNode} the node that was clicked
	 */
	function _selectLink(oNodeData) {
		// Expand the node.
		oNodeData.expand();
		// Lagre expanded/collapsed-tilstand p� nodene p� server
		// Iteratre over the nodes to decide the state
		var iCurrentNodeIndex = oNodeData.index;
		var aAllNodes = oNodeData.tree._nodes;
		var sExpandedOids = "";
		var sCollapsedOids = "";
		for (var i=0; i<aAllNodes.length; i++) {
			// In the array aAllNodes there may be indices for which there exist no data
			if ((typeof aAllNodes[i]) == "undefined") {
				continue;
			}
			var oNode = aAllNodes[i];
			// Is the currently expanded?
			var bExpanded = oNode.expanded;
			// Toggle har ikke v�rt kj�rt enn�, klikket node skal alltid v�re expanded etterp�.
			if (oNode.index == iCurrentNodeIndex) {
				//bExpanded = true;
				oNode.collapse();
			}
			if (bExpanded) {
				if (sExpandedOids.length > 0) {
					sExpandedOids = sExpandedOids + ",";
				} 
				sExpandedOids = sExpandedOids + oNode.data.oid; 
			} else {
				if (sCollapsedOids.length > 0) {
					sCollapsedOids = sCollapsedOids + ",";
				}
				sCollapsedOids = sCollapsedOids + oNode.data.oid;
			}
		}
		// Send informasjon om hvilke noder som er expanded til server
		var sUrl = "ajax.php?o=mainmenu&f=savenodestate&a0="+sExpandedOids+"&a1="+sCollapsedOids;
		var oTrans = YAHOO.util.Connect.asyncRequest('GET', sUrl, _selectLink.cbSaveNodeStates, null);
		// Navigate to wanted destination
		window.location = oNodeData.data.url;
	};

	var _cbSaveNodeStates = {
		success: function(oAjaxResponse) {
		}
	};
	// Do construction things
	if ((typeof CCOMM.inlineData.mainMenu) == undefined) {
		var sUrl = "ajax.php?o=mainmenu&f=getmainmenu";
		var oTrans = YAHOO.util.Connect.asyncRequest('GET', sUrl, _loadMenu, null);
	} else {
		// Pick up data sent with the main document
		_buildMenu(CCOMM.inlineData.mainMenu);
	}		
	
	return {};
};

CCOMM.staticHeader = {};

CCOMM.staticHeader.init = function(oStaticHeader) {
};

CCOMM.util = {};

CCOMM.util.sms = function() {
	
};

CCOMM.util.testwgt = function() {
	
	var yDom = YAHOO.util.Dom;
	
	var _oUploader;
	
	var that = {
	};
	
	function _buildUploader() {
		_oUploader = CCOMM.util.fileUploader();
		var dUploadarea = document.createElement('div');
		dUploadarea.id = 'app_file_cont_upload';
		yDom.get('wgt_testing').appendChild(dUploadarea);
		_oUploader.dContainer = dUploadarea;
		_oUploader.build(); 
	}
	_buildUploader();
	return that;
};

CCOMM.util.fileUploader = function() {
	
	// shorthand
	var yDom = YAHOO.util.Dom;
	var yEvent = YAHOO.util.Event;
	var yUploader = YAHOO.widget.Uploader;

	// Declare private variabels
	var _dSelectAnchor;
	var _oUploader;
	var _oFileList;
	

	// Declare public properties and methods
	var that = {
		dContainer: document.createElement('div'),
		build: function() {
			_build();
		}
	};

	// Declare private functions
	function _build() {
		//Build DOM elements
		var dUiWrapper = document.createElement('div');
		dUiWrapper.id = 'util_uploader_uiwrapper';
		yDom.setStyle(dUiWrapper, 'display', 'inline');
		var dSelectWrapper = document.createElement('div');
		// the following element will contain the flash. It has to overlay the element that launches
		// the "open file"-dialog for security reasons. Therefore it has z-index 2
		var dSelectOverlay = document.createElement('div');
		yDom.setStyle(dSelectOverlay, 'position', 'absolute');
		yDom.setStyle(dSelectOverlay, 'z-index', '2');
		var dSelectLink = document.createElement('div');
		dSelectLink.id = 'util_uploader_selectfiles';
		yDom.setStyle(dSelectLink, 'z-index', '1');
		_dSelectAnchor = document.createElement('a');
		_dSelectAnchor.innerHTML = "Select Files";
		var dUploadLink = document.createElement('div');
		dUploadLink.id = 'util_uploader_uploadfiles';
		var dUploadAnchor = document.createElement('a');
		dUploadAnchor.innerHTML = "Upload Files";
		
		// Attach elements to DOM top-down
		that.dContainer.appendChild(dUiWrapper);
		dUiWrapper.appendChild(dSelectWrapper);
		dSelectWrapper.appendChild(dSelectOverlay);
		dSelectWrapper.appendChild(dSelectLink);
		dSelectLink.appendChild(_dSelectAnchor);
		dUiWrapper.appendChild(dUploadLink);
		dUploadLink.appendChild(dUploadAnchor);
		
		// Set size of the overlay
		var oRegionSelect = yDom.getRegion(dSelectLink);
		yDom.setStyle(dSelectOverlay, 'width', oRegionSelect.right-oRegionSelect.left +'px');
//		yDom.setStyle(dSelectOverlay, 'left', '200px');
		yDom.setStyle(dSelectOverlay, 'height', oRegionSelect.bottom-oRegionSelect.top +'px');
		
		// Initiate uploader
		yUploader.SWFURL = 'addin/yui/build/uploader/assets/uploader.swf';
		_oUploader = new yUploader(dSelectOverlay);
		
		// Attach eventhandlers
		_oUploader.addListener('contentReady', _ehContentReady);
		_oUploader.addListener('fileSelect', _ehFileSelect)
		_oUploader.addListener('uploadStart', _ehUploadStart);
		_oUploader.addListener('uploadProgress', _ehUploadProgress);
		_oUploader.addListener('uploadCancel', _ehUploadCancel);
		_oUploader.addListener('uploadComplete', _ehUploadComplete);
		_oUploader.addListener('uploadCompleteData', _ehUploadResponse);
		_oUploader.addListener('uploadError', _ehUploadError);
	    _oUploader.addListener('rollOver', _ehRollOver);
	    _oUploader.addListener('rollOut', _ehRollOut);
	    _oUploader.addListener('click', _ehClick);
//		_oUploader.addListener('mouseDown', _ehMouseDown);
//		_oUploader.addListener('mouseUp', _ehMouseUp);
		
		yEvent.addListener(dUploadLink, 'mouseover', _ehRollOver);
		yEvent.addListener(dUploadLink, 'mouseout', _ehRollOut);
	}  
	
	function _createDataTable(entries) {
	}  
	function _ehClick() {
	}
	
	function _ehContentReady() {
		// Allows the uploader to send log messages to trace, as well as to YAHOO.log
//		_oUploader.setAllowLogging(true);
		
		// Allows multiple file selection in "Browse" dialog.
//		_oUploader.setAllowMultipleFiles(true);
		
		// New set of file filters.
//		var ff = new Array({description:"Images", extensions:"*.jpg;*.png;*.gif"},
//		                   {description:"Videos", extensions:"*.avi;*.mov;*.mpg"});
		                   
		// Apply new set of file filters to the uploader.
//		_oUploader.setFileFilters(ff);
		
	}
	
	function _ehFileSelect(e) {
		_oFileList = e.fileList;
		_createDataTable(_oFileList);
		
	}
	
	function _ehRollOver() {
		yDom.setStyle(_dSelectAnchor, 'color', '#FFFFFF');
		yDom.setStyle(_dSelectAnchor, 'background-color', '#000000');
	}
	
	
	function _ehRollOut() {
		yDom.setStyle(_dSelectAnchor, 'color', '#0000CC');
		yDom.setStyle(_dSelectAnchor, 'background-color', '#FFFFFF');
	}
	
	function _ehUploadCancel() {
		
	}
	
	function _ehUploadComplete() {
		
	}
	
	function _ehUploadError() {
		
	}
	
	function _ehUploadProgress() {
		
	}
	
	function _ehUploadResponse() {
		
	}
	
	function _ehUploadStart() {
		
	}
	
	
	// Constructor
	// Return instantiated object	
	return that;
};

CCOMM.util.pagePreview = function() {
	var _dWrapper;
	var _dFrame;
	var _dImage;
	var _oOverlay;
	var _oState;
	var _oShowAnim;
	var _oHideAnim
	
	function _initPreview() {
		//calculate position for the preview wrapper
		var iX = 700 + YAHOO.util.Dom.getX('header_img');
		var iY = 150 + 303 + YAHOO.util.Dom.getY('header_img');
		
		_dWrapper = document.createElement('div');
		_dWrapper.id = 'preview_wrapper';
		_dLabel = document.createElement('img');
		_dLabel.id = 'preview_label';
		_dLabel.src = 'gfx/preview_label.png';
		_dFrame = document.createElement('img');
		_dFrame.id = 'preview_frame';
		_dFrame.src = 'gfx/frame.png';
		_dImage = document.createElement('img');
		_dImage.src = 'gfx/discipleship_prev.jpg'
		YAHOO.util.Dom.addClass(_dImage, 'preview_img');
		_dWrapper.appendChild(_dLabel);
		_dWrapper.appendChild(_dFrame);
		_dWrapper.appendChild(_dImage);
		YAHOO.util.Dom.setStyle(_dWrapper, 'opacity', '0');
		//YAHOO.util.Dom.setStyle(_dWrapper, 'zIndex', '1000');
		YAHOO.util.Dom.get('misc').appendChild(_dWrapper);
		//document.body.appendChild(_dWrapper);
		
		_oOverlay = new YAHOO.widget.Overlay(_dWrapper, {
			visible: true,
			zIndex: -1000,
			x: iX,
			y: iY
			});
		_oOverlay.render();
		_oOverlay.show();

		_oShowAnim = new YAHOO.util.Anim('preview_wrapper', {opacity: {to: 1}}, 0.4);
		_oHideAnim = new YAHOO.util.Anim('preview_wrapper', {opacity: {to: 0}}, 0.4);
	}
	
	
	var that = {
		showPreview: function(pageId) {
			if ((typeof CCOMM.data.pages[pageId] != 'undefined')) {
				var oPageData = CCOMM.data.pages[pageId];
				if (oPageData.bPreview) {
					if (((typeof CCOMM.session.imageCache) != 'undefined') && ((typeof CCOMM.session.imageCache[pageId]) != 'undefined')) {
						// See if the preview image already has been loaded into the DOM
						_dWrapper.removeChild(_dImage);
						_dImage = CCOMM.session.imageCache[pageId];
						YAHOO.util.Dom.addClass(_dImage, 'preview_img');
						_dWrapper.appendChild(_dImage);
					} else {
						// The image has not been loaded in cache, switch the src of the existing img-object, forcing a load of the picture
						_dImage.src = oPageData.sPreviewURL;
					}
					_oOverlay.cfg.setProperty("zIndex", 1000);
					_oShowAnim.animate();
					//YAHOO.util.Dom.setStyle(_dWrapper, 'opacity', '1');
				} else {
					that.hidePreview(pageId);
				}
			}
		},
		hidePreview: function() {
			_oOverlay.cfg.setProperty("zIndex", -1000);
			_oHideAnim.animate();
			//_oOverlay.hide();
			//YAHOO.util.Dom.setStyle(_dWrapper, 'opacity', '0.5');
		}
	}
	
	
	_initPreview();
	return that;
};

/**
 * Remove a DOM object from the DOM
 * @param object dEl Dom object to remove
 * return boolean Did the operation succeed?
 */
CCOMM.util.removeFromDom = function(dEl) {
	/* ccommtodo Add error handling */
	// Remove all event listeners
	YAHOO.util.Event.purgeElement(dEl, true);
	dEl.parentNode.removeChild(dEl);
	return true;
};



CCOMM.util.ajax = function(sPhpObject, sMethod, aParams, fCallback) {
	
	function _cbHandler() {
		
	}
	return {
		
	};
};

/**
 * Function
 */
CCOMM.util.emailNewUser = function(oPerson) {
	
};

/**
 * @constructor
 */
CCOMM.util.form = function(sName) {
	var _aControls = [];
	var _oFormEl;
	return {
		sName: sName,
		addControl:function() {
		},
		getDomEl: function() {
		}
	};
};


// Controller for email addresses
// Initiated on page load and triggered by CCOMM.mainContent.pageLoader
CCOMM.lib.contactController = function() {
		/*
	 * Standard class setup:
	 * 1. Declare private variable. Prefix names with underscore.
	 * 2. Declare the object 'that' where the members are public properties and
	 *    methods of the instantiated object.
	 * 3. Declare private functions. Prefix names with underscore.
	 * 4. Do construction stuff.
	 * 5. return that
	 * 
	 * Notes: 
	 * The object 'that' can now be referenced from anywhere within the object.
	 * 
	 */
	// Class template: 
	
	// Declare private variabels

	// Declare public properties and methods
	var that = {
		aContacts:	[],
		runLocal:	function(sSearchRoot) {
			var aSpans = YAHOO.util.Dom.getElementsByClassName("contact", "span", sSearchRoot);
			for (var i = 0; i < aSpans.length; i++) {
				that.aContacts[aSpans[i].id] = contact(aSpans[i].id);
			}
		}
	};
	// Local class representing and controlling individual contacts
	var contact = function(sId) {
		
		var that = {};
		
		function _ehClick(e, obj) {
			//console.log('click');
			var sUrl = "ajax.php?o=contact&f=getdata";
			var sPost = "contactid="+sId;
			var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, _receiveData, sPost);
		}
		
		var _receiveData = {
			success: function(oAjaxResponse) {
				//console.log(oAjaxResponse.responseText);
				var oData = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
				//console.log(oData);
				var sName = oData.name;
				var sAddress = oData.address;
				var sHeading = "Email Address";
				var sMessage = "Contact "+sName+" at:<br/><br/>"+"<a href=\"mailto:"+sAddress+"\">"+sAddress+"</a>";
				var msgBox = CCOMM.util.message('msg_'+sId, sHeading, sMessage);
				msgBox.show();
				//window.open('mailto:'+oAjaxResponse.responseText.address);	
			},
			failure: function (oAjaxResponse) {}
		};
		
		// initialize
		YAHOO.util.Event.addListener(sId, "click", _ehClick);
		return that;
	}
	
	
	
	
	
	
	  
	// Constructor
	that.runLocal('wgt_maincontent');;
	// Return instantiated object	
	return that;
};

CCOMM.util.message = function (sId, sHeading, sMessage, bHookActionQueue) {
	var _dContainingDiv = document.createElement("div");
	_dContainingDiv.id = "msgpanel_"+sId;
	YAHOO.util.Dom.get("misc").appendChild(_dContainingDiv);
	var _oPanelCfg = {
		visible:		false,
		draggable:		true,
		close:			true,
		modal:			true,
		effect:			{ effect: YAHOO.widget.ContainerEffect.FADE, duration:0.15},
		fixedcenter:	true,
		width:			"250px"
	};
	var _oPanel = new YAHOO.widget.Panel(_dContainingDiv.id, _oPanelCfg);
	var _dPanelBody = document.createElement("div");
	_dPanelBody.innerHTML = sMessage;
	// Create closebutton
	var _oCloseButton = CCOMM.control.iconButton(sId+"_close", false, "accept.png", 24, 24);
	_oCloseButton.setAction("click", function() { _oPanel.destroy();}); 
	_oCloseButton.setTooltip('Close');
	if (bHookActionQueue) {
		_oPanel.hideEvent.subscribe(CCOMM.session.actionQueue.doNext);
	}
	var _oToolBar = CCOMM.control.toolBar(sId+"_tbclose", [_oCloseButton], 2, 0);
	_dPanelBody.appendChild(_oToolBar.getEl()); 
	// Set content of panel
	_oPanel.setHeader(sHeading);
	_oPanel.setBody(_dPanelBody);
	_oPanel.render();
	return {
		show:	function() {
			_oPanel.show();
		},
		hide:	function() {
			_oPanel.hide();
			
		},
		onClose:	function(fOnClose) {
			_oPanel.hideEvent.subscribe(fOnClose);
		},
		destroy:	function() {
			_oPanel.hide();
			_oPanel.destroy();
			_oPanel = undefined;
			CCOMM.util.removeFromDom(_dContainingDiv);
		}
	};
};

/**
 * oppretter panel og fyller den med en heading, forklarende tekst,
 * en form og noen knapper nederst
 * @constructor
 */
CCOMM.util.dialog = function(sId, sHeading, sExplanation, oForm, oToolbar, bHookActionQueue) {
	//oppretter panel og fyller den med en heading, forklarende tekst,
	// en form og noen knapper nederst
	var _sHeading = sHeading;
	var _sExplanation = sExplanation;
	var _oForm = oForm;
	var _oToolbar = oToolbar;
	var _oPanel;
	var _bDestroyOnHide = true;
	var _dContainingDiv = document.createElement("div");
	
	_dContainingDiv.id = "editpanel_"+sId;
	YAHOO.util.Dom.get("misc").appendChild(_dContainingDiv);
	
	function _build() {
		var _oPanelCfg = {
			visible:		false,
			draggable:		true,
			close:			true,
			modal:			true,
			effect:			{ effect: YAHOO.widget.ContainerEffect.FADE, duration:0.25},
			fixedcenter:	true
		};
		_oPanel = new YAHOO.widget.Panel(_dContainingDiv.id, _oPanelCfg);
		var _dPanelBody = document.createElement("div");
		_dPanelBody.innerHTML = _sExplanation;
		_dPanelBody.appendChild(_oForm);
		_dPanelBody.appendChild(_oToolbar);
		_oPanel.setHeader(_sHeading);
		_oPanel.setBody(_dPanelBody);
		_oPanel.render();
		// Destroy panel after hide
		if (_bDestroyOnHide) {
			_oPanel.hideEvent.subscribe(_oPanel.destroy);
			if (bHookActionQueue) {
				_oPanel.destroyEvent.subscribe(CCOMM.session.actionQueue.doNext);
			}
		} else if (bHookActionQueue) {
			_oPanel.hideEvent.subscribe(CCOMM.session.actionQueue.doNext);
		}
	}
	
	_build();
	
	return {
		sId:		sId,
		setToolbar:	function(oToolbar) {
			_oToolbar = oToolbar;
			_build();
		},
		show:		function() {
			_oPanel.show();
		},
		hide:		function() {
			_oPanel.hide();
		},
		removeListeners:	function() {
			// remove event listeners from _oPanel and all its descendents
			YAHOO.util.Event.purgeElement(_oPanel, true);
		},
		destroy:	function() {
			_oPanel.hide();
			//setTimeout("_oPanel.destroy()", 300);
		},
		setPanelProperty:	function(property, value) {
			_oPanel.cfg.setProperty(property, value);
			_oPanel.render();
		}
		
	};
};

/**
 * @constructor
 * @extends CCOMM.util.dialog
 * @param {object} CCOMM.person.editPerson Person object to be edited
 * @param {boolean} bCreatedbyDetailpanel Is the object created by detail panel?
 * @param {object} oDetail
 * @param 
 */
CCOMM.person.editPerson = function (oPerson, bCreatedbyDetailpanel, oDetail, bHookActionQueue) {
	var _sId = "editperson_"+oPerson.pid;
	//bNewPerson = (bNewPerson);
	
	/**
	 * Private method.
	 * @member CCOMM.person.editPerson
	 * @private
	 */
	function _save(e, obj) {
		var dForm = YAHOO.util.Dom.get(_sId);
		var bFormOk = true;
		var aErrmsg = [];
		for (var i=0; i<dForm.elements.length; i++) {
			var sElId = dForm.elements[i].name;
			var sElValue = dForm.elements[i].value;//encodeURIComponent(dForm.elements[i].value);
			var oValidation = oPerson.validate(sElId, sElValue);
			if (!oValidation.bOk) {
				bFormOk = false;
				aErrmsg.push(oValidation.sErrmsg);
			}
		}
		if (!bFormOk) {
			// Noen av feltene ble ikke godkjent
			var sMsgboxId = "msgbox_"+oPerson.pid;
			var sHeading = "Manglende eller ugyldig informasjon";
			var sMessage = aErrmsg.join("<br>");
			var oMsgbox = CCOMM.util.message(sMsgboxId, sHeading, sMessage);
			oMsgbox.show();
		} else {
			// Alle feltene ble godkjent, lagre resultatene
			for (var i=0; i<dForm.elements.length; i++) {
				var sElId = dForm.elements[i].name;
				var sElValue = dForm.elements[i].value;
				oPerson.set(sElId, sElValue);
			}
			oPerson.save(_cbSaved);
			if ((typeof CCOMM.session.folkController) != undefined) {
				CCOMM.session.folkController.refreshDetail(oPerson.pid);
			}
		}
	}
	
		
	var _sHeading = oPerson.fnavn + " " + oPerson.enavn;
	var _sExplanation = "Endre navn og kontaktinfo nedenfor:"; 
	var _sFormTemplate = '<form id="'+_sId+'" action="index.php" method="post">' +
			'<div class="enablecursor"><table class="form">' +
			'<tr>' +
			'<td class="label fnavn"><label for="fnavn">Fornavn:</label></td>' +
			'<td><input type="text" name="fnavn" id="ep_fnavn" value="{fnavn}" size="{dftinputw}"></td>' +
			'</tr>' +
			'<tr>' +
			'<td class="label"><label for="enavn">Etternavn:</label></td>' +
			'<td><input type="text" name="enavn" id="ep_enavn" value="{enavn}" size="{dftinputw}"></td>' +
			'</tr>';
	_sFormTemplate += '<tr>' +
			'<td class="label email"><label for="epost">Epost:</label></td>' +
			'<td><input type="text" name="epost" value="{epost}" size="{dftinputw}"></td>' +
			'</tr>' +
			'<tr>' +
			'<td class="label tlfmob"><label for="tlfmob">Mobiltelefon:</label></td>' +
			'<td><input type="text" name="tlfmob" value="{tlfmob}" size="{dftinputw}"></div></td>' +
			'</tr>' +
			'<tr>' +
			'<td class="label tlfhjem"><label for="tlfhjem">Hjemmetelefon:</label></td>' +
			'<td><input type="text" name="tlfhjem" value="{tlfhjem}" size="{dftinputw}"></td>' +
			'</tr>' +
			'<tr>' +
			'<td class="label address"><label for="adresse">Adresse:</label></td>' +
			'<td><input type="text" name="adresse" value="{adresse}" size="{dftinputw}"></td>' +
			'</tr>' +
			'<tr>' +
			'<td class="label"><label for="postnr">Postnr og sted:</label></td>' +
			'<td><input type="text" name="postnr" value="{postnr}"  size="{postnrinputw}">' +
			'<input type="text" name="sted" value="{sted}" size="{stedinputw}"></td>' +
			'</tr>' +
			'<tr>' +
			'<td class="label facebook"><label for="facebook">Facebook:</label></td>' +
			'<td><input type="text" name="facebook" value="{facebook}" size="{dftinputw}"></td>' +
			'</tr>' +
			'</table></div>' +
			'</form>';
	
	var _dFormContainer = document.createElement("div");
	oPerson.dftinputw = "30";
	oPerson.postnrinputw = "4";
	oPerson.stedinputw = "24";
	_dFormContainer.innerHTML = _sFormTemplate.supplant(oPerson);
	// Make buttons for the lower toolbar
	var aButtons = [];
	var oButtonCancel = CCOMM.control.iconButton("cancel"+oPerson.pid, false, "close.png", 24);
	oButtonCancel.setTooltip('Avbryt');
	aButtons.push(oButtonCancel);
	var oButtonSave = CCOMM.control.iconButton("save"+oPerson.pid, false, "floppy_blue.png", 24);
	oButtonSave.setAction("click", _save);
	oButtonSave.setTooltip('Lagre');
	aButtons.push(oButtonSave);
	
	var _oToolbar = CCOMM.control.toolBar("edit_toolbar"+oPerson.pid, aButtons, 2, 0);
	
	var that = CCOMM.util.dialog(_sId, _sHeading, _sExplanation, _dFormContainer, _oToolbar.getEl());
	oButtonCancel.setAction("click", that.hide);
	if (bHookActionQueue) {
		oButtonCancel.setAction("click", CCOMM.session.actionQueue.doNext);
	}

	
	// Gi person-objektet en referanse til dialogen så det klarer å lukke dialgen etter lagring.
	that.cbSaved = {
		success:	function() {
			that.hide();
			if (bCreatedbyDetailpanel) {
			}
			if (bHookActionQueue) {
				CCOMM.session.actionQueue.doNext();
			}
		}
	}
	oPerson.editDialog = that;
	return that;
};

/**
 * Wizard based on dialogs
 * @constructor
 */
CCOMM.util.wizard = function(sId) {
	var oFirstStep;
	var oCurrentStep;
	var that = this;
	
	return {
		sId:				sId,
		/* default configuration */
		cfg:		{
			effect:			{ effect: YAHOO.widget.ContainerEffect.FADE, duration:0.25},
			fixedcenter:	true,
			width:			"300px"
		},
		oPanel:				{},

		_getFullBody:		function() {
			var dFullbody = document.createElement("div");
			// add prev- and next-toolbar
			var aButtons = [];
			if (this.oCurrentStep.bEnableCancel) {
				var oCancelButton = CCOMM.control.iconButton(this.oCurrentStep.sId + "_Cancel", false, "close.png", 24);
				oCancelButton.setAction("click", this.cancel, this)
				oCancelButton.setTooltip("Avbryt");
				aButtons.push(oCancelButton);
			}
			// Add Previous button if enabled
			if (this.oCurrentStep.bEnablePrev) {
				var oPrevButton = CCOMM.control.iconButton(this.oCurrentStep.sId + "_prev", false, "prev.png", 24);
				oPrevButton.setTooltip("Gå tilbake");
				if (this.oCurrentStep.fOnPrev === undefined) {
					//oPrevButton.setAction("click", this.prev, this);
				} else {
					oPrevButton.setAction("click", this.oCurrentStep.fOnPrev);
				}
				aButtons.push(oPrevButton);
			}
			if (this.oCurrentStep.bEnableNext) {
				var oNextButton = CCOMM.control.iconButton(this.oCurrentStep.sId + "_next", false, "next.png", 24);
				oNextButton.setTooltip("Gå videre");
				//var testfunc = function (e, obj) {//console.log("testfunc"); }
				if (this.oCurrentStep.fOnNext === undefined) {
					//oNextButton.setAction("click", this.next, this);
				} else {
					oNextButton.setAction("click", this.oCurrentStep.fOnNext);
					//oNextButton.setAction("click", testfunc);
				}
				aButtons.push(oNextButton);
			}
			if (this.oCurrentStep.bEnableFinish) {
				var oFinishButton = CCOMM.control.iconButton(sId+"_finish", false, "accept.png", 24);
				oFinishButton.setTooltip("Ferdig");
				if (this.oCurrentStep.fOnFinish === undefined) {
				} else {
					oFinishButton.setAction("click", this.oCurrentStep.fOnFinish);
				}				
				aButtons.push(oFinishButton);
			}		
			var _oToolbar = CCOMM.control.toolBar(sId+"_toolbar_"+this.oCurrentStep.sId, aButtons, 1, 0);
			dFullbody.appendChild(this.oCurrentStep.dBody);
			dFullbody.appendChild(_oToolbar.getEl());
			return dFullbody;
		},
		/**
		 * Add a step to the wizard.
		 * Has no effect after the wizard has been started
		 */
		addStep:	function(oStep) {
			if (this.oFirstStep === undefined) {
				this.oFirstStep = oStep;
				return;
			}
			var oCurStep = this.oFirstStep;
			if (oCurStep !== undefined) {
				while (oCurStep.oNextStep !== undefined) {
					oCurStep = oCurStep.oNextStep;
				}
			}
			oCurStep.oNextStep = oStep;
		},
		defaultStep:	function() {
			oStep = {
				sId:			"",
				sHeading:		"",
				dBody:			document.createElement("div"),
				fOnPrev:		function() {},
				fOnNext:		function() {},
				fOnFinish:		function() {},
				bEnableCancel:	true,
				bEnablePrev:	true,
				bEnableNext:	true,
				bEnableFinish:	false,
				oNextstep:		undefined
			};
			return oStep;
		},
		/**
		 * Start the wizard
		 */
		start:		function() {
			this.oCurrentStep = this.oFirstStep;
			// Create dialog to contain the wizard
			var _dContainingDiv = document.createElement("div");
			_dContainingDiv.id = this.sId;
			YAHOO.util.Dom.get("misc").appendChild(_dContainingDiv);
			var _oPanelCfg = {
				visible:		false,
				draggable:		true,
				close:			true,
				modal:			true,
				effect:			this.cfg.effect,
				fixedcenter:	this.cfg.fixedcenter,
				width:			this.cfg.width
			};
			this.oPanel = new YAHOO.widget.Panel(_dContainingDiv, _oPanelCfg);
			this.oPanel.setHeader(this.oFirstStep.sHeading);
			this.oPanel.setBody(this._getFullBody());
			this.oPanel.render();
			this.oPanel.show();
			
		},
		cancel:			function(e, oWizard) {
			oWizard.oPanel.hide();
		},
		/**
		 * Go back one step
		 */
		prev:			function(e, obj) {
			_iCurrentStep--;
			obj.oPanel.setHeader(_aSteps[_iCurrentStep].sHeading);
			obj.oPanel.setBody(obj._getFullBody());
			obj.oPanel.render();
		},
		/**
		 * Go forward one step
		 */
		next:			function(e, obj) {
			this.oCurrentStep = this.oCurrentStep.oNextStep;
			this.oPanel.setHeader(this.oCurrentStep.sHeading);
			this.oPanel.setBody(this._getFullBody());
			this.oPanel.render();
			this.oPanel.show();
		},
		finish:			function(e, obj) {
			this.oPanel.hide();
		},
		destroy:		function() {
			this.oPanel.removeListeners();
			this.oPanel.hide();
		},
		debug:			function() {
		}
	};
};

/*
function menytest() {
	//alert("hei");
	var gruppeTree = new YAHOO.widget.TreeView("main_menu");
	var aNodes = new Array();
	aNodes['node0'] = gruppeTree.getRoot();
	
	var node1 = {
		label: "node 1"
	}
	aNodes['node1'] = new YAHOO.widget.TextNode(node1, aNodes['node0'], false);
	
	var node11 = {
		label: "node 1.1"
	}
	aNodes['node11'] = new YAHOO.widget.TextNode(node11, aNodes['node1'], false);
	
	var node111 = {
		label: "node 1.1.1"
	}
	aNodes['node111'] = new YAHOO.widget.TextNode(node111, aNodes['node11'], false);
	
	var node2 = {
		label: "node 2"
	}
	aNodes['node2'] = new YAHOO.widget.TextNode(node2, aNodes['node0'], false);
	
	var node3 = {
		label: "node 3"
	}
	aNodes['node3'] = new YAHOO.widget.TextNode(node3, aNodes['node0'], false);
	
	gruppeTree.draw();
}
*/

/* @ccommtodo Bygg om CCOMM.gruppeAdm fra statisk til dynamisk klasse */
CCOMM.gruppeAdm = function () {
	CCOMM.gruppeAdm.loadPage();
	return {};
};

CCOMM.gruppeAdm.loadPage = function () {
	CCOMM.session.gruppeAdm = {};
	CCOMM.gruppeAdm.initLoadGruppeTree();
	CCOMM.gruppeAdm.initLoadMembers("");
	CCOMM.gruppeAdm.initLoadNonMembers("");
	YAHOO.util.Event.addListener("gruppeadm_members_search", "keyup", CCOMM.gruppeAdm.searchKeyTyped, { whichsearch: "members"} );
	YAHOO.util.Event.addListener("gruppeadm_nonmembers_search", "keyup", CCOMM.gruppeAdm.searchKeyTyped, {whichsearch: "nonmembers"} );
};

CCOMM.gruppeAdm.searchKeyTyped = function (e, obj) {
	if (obj.whichsearch == "members") {
		var oText = YAHOO.util.Dom.get("gruppeadm_members_search");
		var sText = oText.value;
		CCOMM.gruppeAdm.initLoadMembers(sText);
	} else {
		var oText = YAHOO.util.Dom.get("gruppeadm_nonmembers_search");
		var sText = oText.value;
		CCOMM.gruppeAdm.initLoadNonMembers(sText);
	}
};

CCOMM.gruppeAdm.initLoadGruppeTree = function () {
	// Start lasting av members
	var sUrl = "ajax.php?o=gruppeadm&f=gettree";
	var oTrans = YAHOO.util.Connect.asyncRequest('GET', sUrl, CCOMM.gruppeAdm.loadGruppeTree, null);
}

CCOMM.gruppeAdm.loadGruppeTree = {
	success: function(oAjaxResponse) { 
  		// Init TreeView-objekt
  		var gruppeTree = new YAHOO.widget.TreeView("treeDiv");
		var aNodes = new Array();
		aNodes[0] = gruppeTree.getRoot();
		// Parse xml med info om grupper og få resultatet i en array.
		var aGrupper = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
		for (var i = 0; i < aGrupper.length; i++) {
			var oid = aGrupper[i].oid;
			var navn = aGrupper[i].navn;
			var parent = aGrupper[i].parent;
			var nodeObj = {
				label: navn,
				gid: oid
			};
			aNodes[oid] = new YAHOO.widget.TextNode(nodeObj, aNodes[parent], false);
		}
		CCOMM.session.gruppeAdm.gruppeTree = gruppeTree;
		CCOMM.session.gruppeAdm.aNodes = aNodes;
		gruppeTree.draw();
		gruppeTree.subscribe("labelClick", CCOMM.gruppeAdm.initSelectGruppe);
  	},
	failure: function(oAjaxResponse) {}
};

CCOMM.gruppeAdm.initSelectGruppe = function (nodeObj) {
	
	var sUrl = "ajax.php?o=gruppeadm&f=selectgruppe";
	var sPost = "gid="+nodeObj.data.gid;
	var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, CCOMM.gruppeAdm.selectGruppe, sPost);
};

CCOMM.gruppeAdm.selectGruppe = {
	success: function(oAjaxResponse) { 
		CCOMM.gruppeAdm.initLoadMembers("");
		CCOMM.gruppeAdm.initLoadNonMembers("");
		CCOMM.gruppeAdm.initLoadInfo();
  	},
  	failure: function(oAjaxResponse) {}
};

CCOMM.gruppeAdm.initLoadInfo = function () {
	var sUrl = "ajax.php?o=gruppeadm&f=getInfo";
	var sPost = "";
	var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, CCOMM.gruppeAdm.loadInfo, sPost);
};

CCOMM.gruppeAdm.loadInfo = {
	success: function(oAjaxResponse) {
		// Ensure there is an object in CCOMM.session to cache things to be remembered
		if (CCOMM.session.gruppeAdm === undefined) {
			CCOMM.session.gruppeAdm = {};
		}
		// Get the info object about the selected group from ajax response
		var oResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
		var oInfo = oResponse.info;
		// Cache the info object
		CCOMM.session.gruppeAdm.oGroupInfo = oInfo;
		
		// Get dom objects
		var dInfo = YAHOO.util.Dom.get('gruppeadm_info');
		var dNavn = YAHOO.util.Dom.get('gruppeadm_navn');
		var dDescr = YAHOO.util.Dom.get('gruppeadm_descr');
		// Make the info block visible
		YAHOO.util.Dom.setStyle("gruppeadm_info", "display", "block");
		// set navn and beskrivelse
		dNavn.innerHTML = oInfo.navn;
		dDescr.innerHTML = oInfo.descr;
		if (oInfo.descr.length == 0) {
			// The description is empty, make sure there is an area where the user can click
			// to edit the description
			YAHOO.util.Dom.setStyle(dDescr, 'padding-right', '50px');
		}
		
		// Add edit controls if logged in user has the necessary rights
		if (oInfo.mayskrive) {
			YAHOO.util.Dom.addClass(dNavn, 'editable');
			YAHOO.util.Dom.addClass(dDescr, 'editable');
			var oInEdNavn = CCOMM.control.inlineEdit(dNavn, {gid: oInfo.gid, oclass: 'Group', attr: 'grnavn'});
			var oInEdBeskr = CCOMM.control.inlineEdit(dDescr, {gid: oInfo.gid, oclass: 'Group', attr: 'descr'}, 70);
			oInEdNavn.setOnSave(CCOMM.gruppeAdm.initSaveValue);
			oInEdBeskr.setOnSave(CCOMM.gruppeAdm.initSaveValue);
		}
		
		// Configure toolbar
		// First, remove existing toolbar from DOM
		if (YAHOO.util.Dom.inDocument('gruppeadm_toolbar')) {
			var dToolbar = YAHOO.util.Dom.get('gruppeadm_toolbar');
			dToolbar.parentNode.removeChild(dToolbar);
		}
		if (oInfo.mayskrive || oInfo.mayopprette) {
			// The user have enough rights to need an action toolbar
			var aButtons = [];
			if (oInfo.mayskrive) {
				var oDeleteGroupButton = CCOMM.control.iconButton('gruppeadm_delbutton', false, 'delete.png', 16);
				oDeleteGroupButton.setTooltip("Slett gruppa '" + oInfo.navn + "'");
				oDeleteGroupButton.setAction('click', CCOMM.gruppeAdm.initDelGroup, oInfo);
				aButtons.push(oDeleteGroupButton);
			}
			if (oInfo.mayopprette) {
				var oAddGroupButton = CCOMM.control.iconButton('gruppeadm_addbutton', false, 'add.png', 16);
				oAddGroupButton.setTooltip("Ny undergruppe av '" + oInfo.navn + "'");
				oAddGroupButton.setAction('click', CCOMM.gruppeAdm.initAddSubGroup, oInfo);
				aButtons.push(oAddGroupButton);
			}
			var oToolbar = CCOMM.control.toolBar('gruppeadm_toolbar', aButtons, 1, 0, 10);
			// Create the toolbar and add it to the DOM
			var dToolbar = oToolbar.getEl();
			YAHOO.util.Dom.setStyle(dToolbar, 'text-align', 'right');
			dInfo.appendChild(dToolbar);
		}
	},
	failure: function(oAjaxResponse) {}
}

CCOMM.gruppeAdm.initLoadMembers = function (sSearch) {
	var sUrl = "ajax.php?o=gruppeadm&f=getmembers";
	var sPost = "searchstring="+sSearch;
	var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, CCOMM.gruppeAdm.loadMembers, sPost);	
};



CCOMM.gruppeAdm.loadMembers = {
	success: function(oAjaxResponse) {
		// Få tak i status fra php-backend
		var oResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
		var aStatus = oResponse['status'];
		if (aStatus['gid'] == 0) {
			// Ingen gruppe er valgt. Gi beskjed om dette og avslutt funksjon
			YAHOO.util.Dom.setStyle("velggruppebeskjed", "display", "block");
			YAHOO.util.Dom.setStyle("gruppeadm_members_main", "display", "none");
			return;
		} else {
			YAHOO.util.Dom.setStyle("velggruppebeskjed", "display", "none");
			YAHOO.util.Dom.setStyle("gruppeadm_members_main", "display", "block");
		}
		
		// Parse xml med medlemmer og f� resultatet i en array.
		var aMembers = oResponse['members'];
		
		var oFragment = document.createDocumentFragment();	
		// Legg til medlemmene i oFragment
		for (var i = 0; i < aMembers.length; i++) {
	        var oid = aMembers[i].oid;
	        var fnavn = aMembers[i].fnavn;
	        var enavn = aMembers[i].enavn;
	        var dirMember = aMembers[i].dirmember;
	        var navn = fnavn + " " + enavn;
	        var spanMember = document.createElement("span");
	        var membericon;
	        spanMember.id = oid;
	        if (dirMember == "1") {
	        	spanMember.className = "gruppeadm_dirmember";
	        	membericon = icon_gruppe_member_remove;
	        	
	        } else {
	        	spanMember.className = "gruppeadm_indirmember"
	        	membericon = icon_gruppe_indirmember_passive;
	        }
	        var oImg = document.createElement("img");
	        oImg.src = "gfx/icons/" + membericon;
	        spanMember.appendChild(oImg);
	        var oTxt = document.createTextNode(navn);
	        spanMember.appendChild(oTxt);
	        var divMellom = document.createElement("div");
	        divMellom.appendChild(spanMember)
	        oFragment.appendChild(divMellom);
	        if (dirMember == "1") {
	        	// Legg til eventlistener for klikk p� minusknappen
	        	YAHOO.util.Event.addListener(oImg, "click", CCOMM.gruppeAdm.initRemoveMember, spanMember);
	        }
	        
			
		}
		var divRamme = document.getElementById("gruppeadm_members_list");
		divRamme.innerHTML = "";
		divRamme.appendChild(oFragment);
	},
	failure: function(oAjaxResponse) {}
};


CCOMM.gruppeAdm.initLoadNonMembers = function (sSearch) {
	var sUrl = "ajax.php?o=gruppeadm&f=getnonmembers";
	var sPost = "searchstring="+sSearch;
	var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, CCOMM.gruppeAdm.loadNonMembers, sPost);
};

CCOMM.gruppeAdm.loadNonMembers = {
	success: function(oAjaxResponse) {
		// Få tak i status fra php-backend
		var oResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
		var oStatus = oResponse['status'];
		if (oStatus.gid == 0) {
			// Ingen gruppe er valgt. Gi beskjed om dette og avslutt funksjon
			YAHOO.util.Dom.setStyle("velggruppebeskjed", "display", "block");
			YAHOO.util.Dom.setStyle("gruppeadm_nonmembers_main", "display", "none");
			return;
		} else {
			YAHOO.util.Dom.setStyle("velggruppebeskjed", "display", "none");
			YAHOO.util.Dom.setStyle("gruppeadm_nonmembers_main", "display", "block");
		}
		// Parse xml med medlemmer og f� resultatet i en array.
		var aNonMembers = oResponse['nonmembers'];
		
		var oFragment = document.createDocumentFragment();	
		// Legg til medlemmene i oFragment
		for (var i = 0; i < aNonMembers.length; i++) {
	        var oid = aNonMembers[i].oid;
	        var fnavn = aNonMembers[i].fnavn;
	        var enavn = aNonMembers[i].enavn;
	        var navn = fnavn + " " + enavn;
	        var spanNonMember = document.createElement("span");
	        spanNonMember.id = oid;
	        spanNonMember.className = "gruppeadm_nonmember";
	        var oImg = document.createElement("img");
	        oImg.src = "gfx/icons/" + icon_gruppe_nonmember_add;
	        spanNonMember.appendChild(oImg);
	        var oTxt = document.createTextNode(navn);
	        spanNonMember.appendChild(oTxt);
	        var divMellom = document.createElement("div");
	        divMellom.appendChild(spanNonMember)
	        oFragment.appendChild(divMellom);
	        YAHOO.util.Event.addListener(oImg, "click", CCOMM.gruppeAdm.initAddMember, spanNonMember);
	    }
		var divRamme = document.getElementById("gruppeadm_nonmembers_list");
		divRamme.innerHTML = "";
		divRamme.appendChild(oFragment);
	},
	failure: function(oAjaxResponse) {}
};

CCOMM.gruppeAdm.initAddMember = function (e, oSpan) {
	var uid = oSpan.id
	var sUrl = "ajax.php?o=gruppeadm&f=addbruker";
	var sPost = "uid="+uid;
	var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, CCOMM.gruppeAdm.membershipChange, sPost);
};

CCOMM.gruppeAdm.initRemoveMember = function (e, oSpan) {
	var uid = oSpan.id
	var sUrl = "ajax.php?o=gruppeadm&f=removebruker";
	var sPost = "uid="+uid;
	var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, CCOMM.gruppeAdm.membershipChange, sPost);
};

CCOMM.gruppeAdm.membershipChange = {
	success: function(oAjaxResponse) {
		var sMemberSearch = YAHOO.util.Dom.get("gruppeadm_members_search").value;
		var sNonMemberSearch = YAHOO.util.Dom.get("gruppeadm_nonmembers_search").value;
		CCOMM.gruppeAdm.initLoadMembers(sMemberSearch);
		CCOMM.gruppeAdm.initLoadNonMembers(sNonMemberSearch);		
	},
	failure: function(oAjaxResponse) {}
};

CCOMM.gruppeAdm.initAddSubGroup = function(e, oInfo) {
	//var uid = oSpan.id
	var sUrl = "ajax.php?o=gruppeadm&f=addSubGroup";
	var sPost = "gid="+oInfo.gid;
	var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, CCOMM.gruppeAdm.cbAddSubGroup, sPost);
};

CCOMM.gruppeAdm.cbAddSubGroup = {
	success: function(oAjaxResponse) {
		var oResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
		if (!oResponse['status']) {
			// Something went wrong
			CCOMM.util.message('gruppeadm_errmsg', 'Gruppen kunne ikke opprettes', oResponse['errmsg']);
			return false;
		}
		// The subgroup was successfully added
		// Add the new group to the grouptree
		var gid = oResponse['info']['gid'];
		var parent = oResponse['info']['parent'];
		var aNodes = CCOMM.session.gruppeAdm.aNodes;
		var nodeObj = {
			label: 'Ny gruppe',
			gid: gid
		};
		aNodes[gid] = new YAHOO.widget.TextNode(nodeObj, aNodes[parent], false);
		CCOMM.session.gruppeAdm.gruppeTree.draw();
		aNodes[parent].expand();
		CCOMM.gruppeAdm.initSelectGruppe(aNodes[gid]);
	},
	failure: function(oAjaxResponse){}
};

CCOMM.gruppeAdm.initSaveValue = function(sValue, e, oPassAlong) {
	var sName = oPassAlong.attr;
	var sUrl = "ajax.php?o=gruppeadm&f=saveValue";
	var sPost = "name="+sName+"&value="+sValue;
	var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, CCOMM.gruppeAdm.cbSaveValue, sPost);
};

CCOMM.gruppeAdm.cbSaveValue = {
	success:	function(oAjaxResponse){
		var oResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
		if (!oResponse['status']) {
			// Something went wrong
			CCOMM.util.message('gruppeadm_errmsg', 'Gruppenavnet kunne ikke lagres', oResponse['errmsg']);
			/* @ccommtodo Need to revert to the grnavn as i was before editing since the save was unsuccessfull. */ 
			return false;
		}
		
		// The value was saved ok. 
		// If the changed value was the group name, update the label of the group 
		// in the group tree
		if (oResponse['name'] === 'grnavn') {
			var iGid = oResponse['gid'];
			var sGrnavn = oResponse['value'];
			CCOMM.session.gruppeAdm.aNodes[iGid].label = sGrnavn;
			//CCOMM.session.gruppeAdm.aNodes[iGid].refresh();
			// refresh the tree
			CCOMM.session.gruppeAdm.gruppeTree.draw();
		}
	},
	failure:	function(){}
};

CCOMM.gruppeAdm.initDelGroup = function(e, oInfo) {
	var sUrl = "ajax.php?o=gruppeadm&f=delGroup";
	var sPost = "";
	CCOMM.gruppeAdm.cbDelGroup.argument = oInfo;
	var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, CCOMM.gruppeAdm.cbDelGroup, sPost);
};

CCOMM.gruppeAdm.cbDelGroup = {
	success:	function(oAjaxResponse){
		var oResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
		if (!oResponse['status']) {
			// Something went wrong
			CCOMM.util.message('gruppeadm_errmsg', 'Gruppen kunne ikke slettes', oResponse['errmsg']);
			/* @ccommtodo Need to revert to the grnavn as i was before editing since the save was unsuccessfull. */ 
			return false;
		} else {
			// remove the deleted group from the group tree
			CCOMM.session.gruppeAdm.gruppeTree.removeNode(CCOMM.session.gruppeAdm.aNodes[this.argument.gid], true);
			var parentId = this.argument.parent;
			// check if there is a node in the grouptree representing this parent
			if (CCOMM.session.gruppeAdm.aNodes[parentId] !== undefined) {
				var oParentNode = CCOMM.session.gruppeAdm.aNodes[parentId];
				CCOMM.gruppeAdm.initSelectGruppe(oParentNode);
			} 
		}
	},
	failure:	function(oAjaxResponse){}
};

/**
 * Frontend controller for email page
 */
CCOMM.message.controller = function() {
		/*
	 * Standard class setup:
	 * 1. Declare private variable. Prefix names with underscore.
	 * 2. Declare the object 'that' where the members are public properties and
	 *    methods of the instantiated object.
	 * 3. Declare private functions. Prefix names with underscore.
	 * 4. Do construction stuff.
	 * 5. return that
	 * 
	 * Notes: 
	 * The object 'that' can now be referenced from anywhere within the object.
	 * 
	 */
	// Class template: 
	
	// Declare private variabels
	var _oCompose;

	// Declare public properties and methods
	var that = {
	};

	// Declare private functions
	function tempLaunchComposer(e, obj) {
		//alert('hei');
		var oComposer = CCOMM.message.composer('genericcomp');
		oComposer.show();
	}
	
	// Constructor
	_oCompose = CCOMM.control.iconButton("email_compose", false, "mail.png", 24);
	_oCompose.setAction('click', tempLaunchComposer);
	YAHOO.util.Dom.get("wgt_email").appendChild(_oCompose.oEl);
	var oEditor = new YAHOO.widget.Editor('rteditor', 
		{
			height: '400px',
			width:	'550px'
		});
	oEditor.render();
	
	
	
	// Return instantiated object	
	return that;
};

/**
 * Controls panel for composing emails
 */
CCOMM.message.composer = function(sId) {
		/*
	 * Standard class setup:
	 * 1. Declare private variable. Prefix names with underscore.
	 * 2. Declare the object 'that' where the members are public properties and
	 *    methods of the instantiated object.
	 * 3. Declare private functions. Prefix names with underscore.
	 * 4. Do construction stuff.
	 * 5. return that
	 * 
	 * Notes: 
	 * The object 'that' can now be referenced from anywhere within the object.
	 * 
	 */
	// Class template: 
	
	// Declare private variabels
	var _sId;
	var _oPanel;
	var _oPanelCfg;
	
	// Declare public properties and methods
	var that = {
		show:		function() {
			_oPanel.render();
			_oPanel.show();
		},
		hide:		function() {
			_oPanel.hide();
		},
		removeListeners:	function() {
			// remove event listeners from _oPanel and all its descendents
			YAHOO.util.Event.purgeElement(_oPanel, true);
		},
		destroy:	function() {
			_oPanel.hide();
			//setTimeout("_oPanel.destroy()", 300);
		},
		setPanelProperty:	function(property, value) {
			_oPanel.cfg.setProperty(property, value);
			_oPanel.render();
		}
	};
	// Declare private functions

	// Constructor
	_sId = sId;
	var _oPanelCfg = {
		visible:		false,
		draggable:		true,
		close:			true,
		modal:			true,
		effect:			{ effect: YAHOO.widget.ContainerEffect.FADE, duration:0.25},
		fixedcenter:	true
	};
	var dContainingDiv = document.createElement("div");
	dContainingDiv.id = "emailcomposer_" + _sId;
	YAHOO.util.Dom.get("misc").appendChild(dContainingDiv);
	
	_oPanel = new YAHOO.widget.Panel(dContainingDiv.id, _oPanelCfg);
	var dPanelBody = document.createElement("div");
	//dPanelBody.innerHTML = 'hei';
	var dEditor = document.createElement("textarea");

	var oEditor = new YAHOO.widget.Editor(dEditor, 
		{
			height: '200px',
			width:	'200px'
		});
	oEditor.render();
	dPanelBody.appendChild(dEditor);
	_oPanel.setHeader('_sHeading');
	_oPanel.setBody(dPanelBody);
	_oPanel.render();

	// Return instantiated object	
	return that;
};

CCOMM.message.entity = function() {
		/*
	 * Standard class setup:
	 * 1. Declare private variable. Prefix names with underscore.
	 * 2. Declare the object 'that' where the members are public properties and
	 *    methods of the instantiated object.
	 * 3. Declare private functions. Prefix names with underscore.
	 * 4. Do construction stuff.
	 * 5. return that
	 * 
	 * Notes: 
	 * The object 'that' can now be referenced from anywhere within the object.
	 * 
	 */
	// Class template: 
	
	// Declare private variabels
	var _param;
	// Declare public properties and methods
	var that = {
	};
	// Declare private functions
	function _priv() {}  
	// Constructor
	_priv();
	_param = "example string";
	// Return instantiated object	
	return that;
};

CCOMM.message.list = function() {
		/*
	 * Standard class setup:
	 * 1. Declare private variable. Prefix names with underscore.
	 * 2. Declare the object 'that' where the members are public properties and
	 *    methods of the instantiated object.
	 * 3. Declare private functions. Prefix names with underscore.
	 * 4. Do construction stuff.
	 * 5. return that
	 * 
	 * Notes: 
	 * The object 'that' can now be referenced from anywhere within the object.
	 * 
	 */
	// Class template: 
	
	// Declare private variabels
	var _param;
	// Declare public properties and methods
	var that = {
	};
	// Declare private functions
	function _priv() {}  
	// Constructor
	_priv();
	_param = "example string";
	// Return instantiated object	
	return that;
};


/*
 * This is an example callback object with success
 * and failure members defined inline.  The argument
 * property demonstrates how to pass multiple values
 * to the callback as an array.
 */
 
/*
function axSelectGruppe(nodeObj) {
	sGid = nodeObj.data.gid;
	YAHOO.util.Dom.get("currentgid").value = sGid;
	var sUrl = "ajax.php?fn=ajax_selectgruppe&a1=" + sGid;
	var oTrans = YAHOO.util.Connect.asyncRequest('GET', sUrl, cbSelectGruppe, null);

}
*/
/*
function loadGruppeTree(objAjaxResponse) {
	
	var gruppeTree = new YAHOO.widget.TreeView("treeDiv");
	var aNodes = new Array();
	aNodes[0] = gruppeTree.getRoot();
	
	// lag zXmlDom objekt, definert i zxml.js
	var oXmlDom =zXmlDom.createDocument();
	
	// "Fyll" XmlDom objekt med teksten mottatt i xml-dokument
	oXmlDom.loadXML(objAjaxResponse.responseText);
	
	// Rot-element i mottatt xml-dokument
	var oRoot = oXmlDom.documentElement;
	
	// Traverser xml-dokument
	var aItems = oRoot.getElementsByTagName("item");
	for (var i = 0; i < aItems.length; i++) {
		var oid = aItems[i].getAttribute("oid");
		var tekst = aItems[i].getAttribute("tekst");
		var parent = aItems[i].getAttribute("parent");
		//var oItem = oRoot.firstChild;
		//var tekst = oItem.getAttribute("tekst");
		//alert(tekst);
		var nodeObj = {
			label: tekst,
			gid: oid
		};
		aNodes[oid] = new YAHOO.widget.TextNode(nodeObj, aNodes[parent], false);
		
		
	}
	gruppeTree.draw();
	gruppeTree.subscribe("labelClick", axSelectGruppe);
	//YAHOO.util.Event.addListener(treeDiv, "mouseover", axSelectGruppe)
	
	
}
*/

/*
var cbLoadMenuTree = {
  success: function(objAjaxResponse) { loadMenuTree(objAjaxResponse);},
  failure: function(objAjaxResponse) {},
  argument: ["argument1", "argument2", "argument3"]
}


function axLoadGruppeTree() {
	// Start lasting av members
	var sUrl = "ajax.php?fn=ajax_gruppetree";
	var oTrans = YAHOO.util.Connect.asyncRequest('GET', sUrl, cbLoadGruppeTree, null);
	//alert("axLoadMenuTree");
}

var cbLoadGruppeTree = {
  success: function(oAjaxResponse) { loadGruppeTree(oAjaxResponse);},
  failure: function(oAjaxResponse) {}
};

var cbSelectGruppe = {
  success: function(oAjaxResponse) { 
  	var sGid = YAHOO.util.Dom.get("currentgid").value;;
	axLoadMembers(sGid);
	axLoadNonMembers(sGid);
	YAHOO.util.Dom.setStyle("admgruppe_nonmembers", "display", "block");
	YAHOO.util.Dom.setStyle("admgruppe_members", "display", "block");
	YAHOO.util.Dom.setStyle("velggruppebeskjed", "display", "none");
  },
  failure: function(oAjaxResponse) {}
};
*/











/* Setter igang ajax-lasting av gruppemedlemmer */
/*
function axLoadMembers(sGid) {
	var sUrl = "ajax.php?fn=gruppemedl&a1=" + sGid;
	var oTrans1 = YAHOO.util.Connect.asyncRequest('GET', sUrl, cbLoadMembers, null);
}
*/

/* Setter igang ajax-lasting av ikke-medlemmer */
/*
function axLoadNonMembers(sGid) {
	var sUrl = "ajax.php?fn=gruppenonmedl&a1=" + sGid;
	var oTrans2 = YAHOO.util.Connect.asyncRequest('GET', sUrl, cbLoadNonMembers, null);
}
*/

/* Kaller ajaxrutine som legger til gruppemedlem */
/*
function axAddMember(e, oSpan) {
	var gid = YAHOO.util.Dom.get("currentgid").value;
	var uid = oSpan.id
	var sUrl = "ajax.php?fn=ajax_addbrukertogruppe&a1=" + uid + "&a2=" + gid;
	var oTrans = YAHOO.util.Connect.asyncRequest('GET', sUrl, cbAddMember, null);
}
*/

/* Kaller ajaxrutine som fjerner gruppemedlem */
/*
function axRemoveMember(e, oSpan) {
	var gid = YAHOO.util.Dom.get("currentgid").value;
	var uid = oSpan.id
	var sUrl = "ajax.php?fn=ajax_removebrukerfromgruppe&a1=" + uid + "&a2=" + gid;
	var oTrans = YAHOO.util.Connect.asyncRequest('GET', sUrl, cbRemoveMember, null);
}
*/

/*
var cbLoadMembers = {
  success: function(objAjaxResponse) {loadMembers(objAjaxResponse);},
  failure: function(objAjaxResponse) {},
  argument: ["argument1", "argument2", "argument3"]
};


var cbLoadNonMembers = {
  success: function(objAjaxResponse) {loadNonMembers(objAjaxResponse);},
  failure: function(objAjaxResponse) {}
};

var cbAddMember = {
  success: function(objAjaxResponse) {membershipChange(objAjaxResponse);},
  failure: function(objAjaxResponse) {}
};

var cbRemoveMember = {
  success: function(objAjaxResponse) {membershipChange(objAjaxResponse);},
  failure: function(objAjaxResponse) {}
};
*/

function loadMembers(objAjaxResponse) {
	// lag zXmlDom objekt, definert i zxml.js
	var oXmlDom =zXmlDom.createDocument();
	// "Fyll" XmlDom objekt med teksten mottatt i xml-dokument
	oXmlDom.loadXML(objAjaxResponse.responseText);
	// Rot-element i mottatt xml-dokument
	var oRoot = oXmlDom.documentElement;
	// Opprett dokument-fragment som fylles med noder fra mottatt xml-dokument
    var oFragment = document.createDocumentFragment();
	var aMembers = oRoot.getElementsByTagName("member");
	
	// Legg til medlemmene i oFragment
	for (var i = 0; i < aMembers.length; i++) {
        var oid = aMembers[i].getAttribute("oid");
        var fnavn = aMembers[i].getAttribute("fnavn");
        var enavn = aMembers[i].getAttribute("enavn");
        var dirMember = aMembers[i].getAttribute("dirmember");
        var navn = fnavn + " " + enavn;
        var spanMember = document.createElement("span");
        var membericon;
        spanMember.id = oid;
        if (dirMember == "1") {
        	spanMember.className = "dirmember";
        	membericon = icon_gruppe_member_remove;
        	
        } else {
        	spanMember.className = "indirmember"
        	membericon = icon_gruppe_indirmember_passive;
        }
        var oImg = document.createElement("img");
        oImg.src = "gfx/icons/" + membericon;
        spanMember.appendChild(oImg);
        var oTxt = document.createTextNode(navn);
        spanMember.appendChild(oTxt);
        var divMellom = document.createElement("div");
        divMellom.appendChild(spanMember)
        oFragment.appendChild(divMellom);
        if (dirMember == "1") {
        	// Legg til eventlistener for klikk p� minusknappen
        	YAHOO.util.Event.addListener(oImg, "click", axRemoveMember, spanMember);
        }
        
        // gj�r draggable
        //var myDDobj = new YAHOO.util.DD(oid);
		
	}
	var divRamme = document.getElementById("admgruppe_members");
	//alert(divRamme.innerHTML);
	divRamme.innerHTML = "";
	divRamme.appendChild(oFragment);
}

function loadNonMembers(objAjaxResponse) {
	// lag zXmlDom objekt, definert i zxml.js
	var oXmlDom =zXmlDom.createDocument();
	// "Fyll" XmlDom objekt med teksten mottatt i xml-dokument
	//alert(objAjaxResponse.responseText);
	oXmlDom.loadXML(objAjaxResponse.responseText);
	// Rot-element i mottatt xml-dokument
	var oRoot = oXmlDom.documentElement;
	// Opprett dokument-fragment som fylles med noder fra mottatt xml-dokument
    var oFragment = document.createDocumentFragment();
	var aNonMembers = oRoot.getElementsByTagName("nonmember");
	
	// Legg til nonmembers i oFragment
	for (var i = 0; i < aNonMembers.length; i++) {
        var oid = aNonMembers[i].getAttribute("oid");
        var fnavn = aNonMembers[i].getAttribute("fnavn");
        var enavn = aNonMembers[i].getAttribute("enavn");
        var navn = fnavn + " " + enavn;
        //alert(navn);
        var spanNonMember = document.createElement("span");
        spanNonMember.className = "nonmember";
        spanNonMember.id = oid;
        var oIconAdd = document.createElement("img");
        oIconAdd.src = "gfx/icons/" + icon_gruppe_nonmember_add;
        //oIconAdd.id = "addicon_"+ oid;
        spanNonMember.appendChild(oIconAdd);
        var oTxt = document.createTextNode(navn);
        spanNonMember.appendChild(oTxt);
        var divMellom = document.createElement("div");
        divMellom.appendChild(spanNonMember)
        oFragment.appendChild(divMellom);
        // gj�r draggable
        //var myDDobj = new YAHOO.util.DD(oid);
        //var myDDobj = new YAHOO.ccomm.DD(oid);
        // Legg til eventlistener for klikk p� plussknappen
        YAHOO.util.Event.addListener(oIconAdd, "click", axAddMember, spanNonMember);
        
        
		
	}
	var divRamme = document.getElementById("admgruppe_nonmembers");
	divRamme.innerHTML = "";
	divRamme.appendChild(oFragment);
}

function membershipChange(objAjaxResponse) {
	var gid = YAHOO.util.Dom.get("currentgid").value;
	// lag zXmlDom objekt, definert i zxml.js
	var oXmlDom =zXmlDom.createDocument();
	// "Fyll" XmlDom objekt med teksten mottatt i xml-dokument
	oXmlDom.loadXML(objAjaxResponse.responseText);
	// Rot-element i mottatt xml-dokument
	var oRoot = oXmlDom.documentElement;
	var aMessage = oRoot.getElementsByTagName("message");
	var suksess = aMessage[0].getAttribute("suksess");
	var errmsg = aMessage[0].getAttribute("errmsg");
	if (suksess) {
		axLoadMembers(gid);
		axLoadNonMembers(gid);
	} else {
		alert("mislykket");
	}
}









function admGruppePageLoad() {
	var sGid = YAHOO.util.Dom.get("currentgid").value;
	axLoadGruppeTree();
	if (sGid == 0) {
		YAHOO.util.Dom.setStyle("velggruppebeskjed", "display", "block");  
	} else {
		YAHOO.util.Dom.setStyle("admgruppe_nonmembers", "display", "block");
		YAHOO.util.Dom.setStyle("admgruppe_members", "display", "block");
		//YAHOO.util.Dom.setStyle("velggruppebeskjed", "display", "block");
		axLoadMembers(sGid);
		axLoadNonMembers(sGid);
	}
}


/**
 * Namespace
 */
CCOMM.minside = {};

CCOMM.minside.controller = function() {
	// Declare private variabels
	
	/**
	 * The logged in person 
	 * CCOMM.person.entity object
	 */
	var _currentPerson;
	var _oMinSideData;
	
	// Declare public properties and methods
	var that = {
	};
	
	// Declare private functions
	function _ehChangePassword(e, obj) {
		var oChangePassword = CCOMM.person.changePassword(_currentPerson, false);
	} 
	
	function _ehEditPerson(e, obj) {
		var oEditPerson = CCOMM.person.editPerson(_currentPerson, false, null, false);
		oEditPerson.show();
	}
	
	function _ehEditInfo(e, obj) {
		
	}
	
	function _infoFirstLogonMustChangePassword() {
		var sHeading = "Første pålogging";
		var sMsg = 'Velkommen!<br/>' +
				'Passordet du har nå ble automatisk generert for deg og du blir nå bedt ' +
				'om å bytte til et nytt passord	som du velger selv.';
		var oMsg = CCOMM.util.message('minside_pwinfo', sHeading, sMsg, true);
		oMsg.show();
	}
	
	function _mustChangePassword() {
		var sHeading = "Du m� endre passord";
		var sMsg = 'Velkommen!<br/>' +
				'Passordet du har nå ble automatisk generert for deg og du blir nå bedt ' +
				'om å bytte til et nytt passord	som du velger selv.';
		var oMsg = CCOMM.util.message('minside_pwinfo', sHeading, sMsg, true);
		//oMsg.onClose(function() {CCOMM.session.actionQueue.doNext();});
		oMsg.show();		
	}
	
	function _launchChangePassword() {
		CCOMM.person.changePassword(_currentPerson, true);
	}
	
	function _infoFirstLogonPersonEdit() {
		var sHeading = "Første pålogging";
		var sMsg = '<p>Det er første gang du er logget inn. Du har nå byttet passord og vi ber videre ' +
				'om at du fyller inn kontaktinfo om deg selv.</p>' +
				'<p>Vi gjør oppmerksom på at informasjonen du legger inn her vil våre tilgjengelig for alle andre ' +
				'i Sentrumkirken som har tilgang til dette intranettet. Hvis du ønsker å reservere deg mot at andre skal' +
				'kunne se denne informasjonen må du ikke legge den inn her. '
				'<p>Når du legger inn epostadressen din vil den kun være synlig for de som kan logge inn på ' +
				'intranettet. Når epost blir sendt fra dette intranettet, beskyttes epostadressene ved at de ikke vises for ' +
				'mottakerne. Dermed er faren for å bli rammet av virus og spam mye mindre. Merk at det er mye enklere for ' +
				'andre å sende deg informasjon om det som skjer i menigheten hvis du oppgir en epostadresse.</p>';
		var oMsg = CCOMM.util.message('minside_editinfo', sHeading, sMsg, true);
		//oMsg.onClose(function() {CCOMM.session.actionQueue.doNext();});
		oMsg.show();
	}
	
	function _launchPersonEdit() {
		var oEditPerson = CCOMM.person.editPerson(_currentPerson, false, null, true);
		oEditPerson.show();
	}
	// Constructor
	if ((typeof CCOMM.inlineData.minside) != "undefined") {
		_oMinSideData = CCOMM.inlineData.minside;
		
	} else {
		// Error
		return false;
	}
	_currentPerson = CCOMM.person.entity(true, _oMinSideData.currentPerson.toJSONString());
	// Add eventlisteners
	YAHOO.util.Event.addListener('minside_endrepassord', 'click', _ehChangePassword);
	YAHOO.util.Event.addListener('minside_endreinfo', 'click', _ehEditPerson);
	
	// If necessary, instantiate actionQueue
	if (CCOMM.session.actionQueue === undefined) {
		CCOMM.session.actionQueue = CCOMM.engine.actionQueue();
	} 
	// Initate password change and edit person if appropriate
	if (_oMinSideData.mustChangePw == 1 && _oMinSideData.firstLogon) {
		// First logon. Change password and propos to edit contact info.
		CCOMM.session.actionQueue.add(_infoFirstLogonMustChangePassword);
		CCOMM.session.actionQueue.add(_launchChangePassword);
		CCOMM.session.actionQueue.add(_infoFirstLogonPersonEdit);
		CCOMM.session.actionQueue.add(_launchPersonEdit);
		CCOMM.session.actionQueue.doNext();
	} else if (_oMinSideData.mustChangePw == 1) {
		CCOMM.session.actionQueue.add(_mustChangePassword);
		CCOMM.session.actionQueue.add(_launchChangePassword);
		CCOMM.session.actionQueue.doNext();
	}
	
	// Return instantiated object	
	return that;
};

CCOMM.hormenu = {};

CCOMM.hormenu.controller = function() {
	
	var aMenuData = [
		{ text: "About Oasis", url: "index.php?side=testside&img=798607", submenu: { id: "about", itemdata: [
			{ text: "Missional Journey", url: "index.php?side=testside&img=708287", submenu: { id: "missional", itemdata: [
				{ text: "Vision", url: "index.php?side=testside&img=74897" },
				{ text: "Values", url: "index.php?side=testside&img=914878"},
				{ text: "Our Story", url: "index.php?side=testside&img=973008"},
				{ text: "Beliefs", url: "index.php?side=testside&img=815226"}
				]} 
			},
			{ text: "Gatherings", url: "index.php?side=testside&img=163524" },
			{ text: "Team" },
			{ text: "Church Planting", submenu: { id: "planting", itemdata: [
				{ text: "Internships" }
				]}
			},
			{ text: "Video Intro", url: "index.php?side=testside&img=856275" },
			{ text: "FAQ", url: "index.php?side=testside&img=856275" }
			] }
		},
		{ text: "Transparent Connections", submenu: { id: "transparent", itemdata: [
			{ text: "Community", submenu: { id: "community", itemdata: [
				{text: "Women", url: "index.php?side=testside&img=540837"},
				{text: "Youth", url: "index.php?side=testside&img=911956"},
				{text: "International Students"},
				{text: "Missions", url: "index.php?side=testside&img=100775"},
				{text: "Prayer", url: "index.php?side=testside&img=969027"},
				{text: "MOPS", url: "index.php?side=testside&img=381861"},
				{text: "Hospitality"}
				]}
			},
			{ text: "Life Groups" },
			{ text: "Children", url: "index.php?side=testside&img=587857"},
			{ text: "Get Involved", url: "index.php?side=testside&img=975335"},
			{ text: "Social Justice", url: "index.php?side=testside&img=480938"},
			{ text: "Earth Care", url: "index.php?side=testside&img=102822"}
			]}
		},
		{ text: "Arts & Culture", submenu: { id: "arts", itemdata: [
			{ text: "Relevance" },
			{ text: "Worship and Beauty", submenu: { id: "worship", itemdata: [
				{ text: "Visual Arts" },
				{ text: "Visual Worship" },
				{ text: "Creative Writing" }
				]}
			},
			{ text: "Video" },
			{ text: "Podcast" },
			{ text: "Blogs" },
			{ text: "Random" }
			]}
		},
		{ text: "Interactive Relationship", submenu: { id: "interactive", itemdata: [
			{text: "Passionate Spirituality"},
			{text: "Spiritual Discovery", submenu: { id: "discovery", itemdata: [
				{text: "Baptism"},
				{text: "Communion"},
				{text: "Discipleship"},
				{text: "Serving"}
				]}
			},
			{ text: "Prayer/Talking to God"},
			{ text: "Resources", submenu: { id: "resources", itemdata: [
				{text: "Books"},
				{text: "Web Sites"}
				]}
			}
			]}
		},
		{ text: "Contact Oasis", submenu: { id: "contact", itemdata: [
			{ text: "Email"},
			{ text: "Map"},
			{ text: "Directions"},
			{ text: "Phone #"},
			{ text: "Mailing Address"}
			]}
		}
	];
	
	var oMenuBar = new YAHOO.widget.MenuBar("hormenu");
	oMenuBar.addItems(aMenuData);
	oMenuBar.render();
	oMenuBar.show();
	
	var oPreview = CCOMM.util.pagePreview(); 
};


CCOMM.folk = {};


CCOMM.folk.controller = function() {
	// Declare private variabels
	var _dataSource;
	var _dataTable;
	var _iDefaultGid;
	var _iCurrentGid;
	var _aDetails;
	var _oCurrentDetail;
	
	// Declare public properties and methods
	var that = {
		overlayManager: 	new YAHOO.widget.OverlayManager(),
		refreshDetail:		function(iPid) {
			// If open refresh the detail panel of the concerned person
			if ((typeof _aDetails[iPid]) == undefined) {
				return false;
			}
			_aDetails[iPid].refresh();
			
			// If the concerned person is listed in the dataTable, update the information there
			var oRecordSet = _dataTable.getRecordSet();
			var aRecords = oRecordSet.getRecords();
			var iNumRecords = aRecords.length;
			var i=0;
			var bPersonFound = false;
			while (i<iNumRecords && !bPersonFound) {
				var oRecord = aRecords[i];
				var oRecordData = oRecord.getData();
				if (oRecordData.pid == iPid) {
					var oPerson = CCOMM.session.persons[iPid];
					var oNewData = {
						pid :		oPerson.pid,
						fnavn :		oPerson.fnavn,
						enavn :		oPerson.enavn,
						tlfmob :	oPerson.tlfmob,
						epost :		oPerson.epost	
					};
					oRecordSet.updateRecord(oRecord, oNewData);
					_dataTable.refreshView();
					
					bPersonFound = true;
				}
				//var dRow = _dataTable.getTrEl(aRecords[i])
				//var dCheckbox = YAHOO.util.Dom.getElementsByClassName('yui-dt-checkbox', 'input', dRow)[0];
				// Check the checkbox
				//dCheckbox.checked = true;
				// Select the row
				//_dataTable.selectRow(aRecords[i]);
				i++;
			}
			
			
			
		}
	};
	// Declare private functions
	
	function _loadTable() {
		function formatterFnavn(elCell, oRecord, oColumn, oData) {
			var sHtml = '<span class="dt_fnavn">'+oData+'</span>';
			elCell.innerHTML = sHtml;
		}
		var colDef = [
			{key:"fnavn", label:"Fornavn", sortable:true, formatter:CCOMM.folk.fnavnFormatter},
			{key:"enavn", label:"Etternavn", sortable:true},
			{key:"epost", label:"Epost"},
			{key:"tlfmob", label:"Mobiltelefon"},
			{label:"Velg", formatter:YAHOO.widget.DataTable.formatCheckbox}
		];
		_dataSource = new YAHOO.util.DataSource("ajax.php?o=folk&f=getgroup");
		_dataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
		_dataSource.connXhrMode = "queueRequests";
		_dataSource.connMethodPost = true;
		_dataSource.responseSchema = {
			resultsList: "ResultSet.Result",
			fields: ["pid","fnavn","enavn","epost","tlfmob"] 
		}; 
		_dataTable = new YAHOO.widget.DataTable("folktable", colDef, _dataSource, {initialRequest: "gid="+_iCurrentGid});
		_dataTable.getColumn(0).resizeable = true;
		_dataTable.getColumn(0).width = "200px";
		// Subscribe to various events
		_dataTable.subscribe("cellClickEvent", _ehRowClick);
		_dataTable.subscribe("rowMouseoverEvent", _ehRowMouseOver);
		// These turn on highlighting when pointer is placed over a row
		_dataTable.subscribe("rowMouseoverEvent", _dataTable.onEventHighlightRow); 
		_dataTable.subscribe("rowMouseoutEvent", _dataTable.onEventUnhighlightRow);
		_dataTable.subscribe("checkboxClickEvent", function(e){ 
			//YAHOO.util.Event.stopEvent(e.event);
			//var elCheckbox = oArgs.target; 
			//var elRecord = this.getRecord(elCheckbox); 
			//var name = elRecord.getData("field5"); 
		}); 
	}
	
	function _ehRowMouseOver(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e.event);
		var pid = _dataTable.getRecord(dEventTarget).getData().pid;
		if ((typeof _aDetails[pid]) == "undefined") {
			_aDetails[pid] = CCOMM.folk.detail(pid, false, e, that);
		}
	}
	
	function _ehRowClick(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e.event);
		var pid = _dataTable.getRecord(dEventTarget).getData().pid;
		var dummy = true;
		if (YAHOO.util.Dom.hasClass(dEventTarget, 'yui-dt-checkbox')) {
			if (dEventTarget.checked) {
				_dataTable.selectRow(dEventTarget);
			} else {
				_dataTable.unselectRow(dEventTarget);
			}
			return;
		}
		if ((typeof _aDetails[pid]) == "undefined") {
			_aDetails[pid] = new CCOMM.folk.detail(pid, true, e, that);
		} else {
			_aDetails[pid].showPanel(e);
		}
		_oCurrentDetail = _aDetails[pid];
	}
	
	
	function _initGroupSelect() {
		// Get the group path of the selected group
		var sUrl2 = "ajax.php?o=folk&f=getGroupPath";
		var sPost2 = "gid="+_iCurrentGid;
		var oTrans2 = YAHOO.util.Connect.asyncRequest('POST', sUrl2, _loadGroupSelect, sPost2);
	}
	
	var _loadGroupSelect = {
		success: function(oAjaxResponse) {
			var oResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
			var dGruppeSpan = YAHOO.util.Dom.get('folk_gruppe');
			dGruppeSpan.innerHTML = oResponse['groupPath'];
			
			// Add stuff to get a hover effect
			fOnMouseover = function(e, dSpan) {
				YAHOO.util.Dom.addClass(dSpan, 'hover');
			}
			fOnMouseout = function(e, dSpan) {
				YAHOO.util.Dom.removeClass(dSpan, 'hover');
			}
			YAHOO.util.Event.addListener(dGruppeSpan, 'mouseover', fOnMouseover, dGruppeSpan);
			YAHOO.util.Event.addListener(dGruppeSpan, 'mouseout', fOnMouseout, dGruppeSpan);
			// Add tooltip
			var oTooltip = new YAHOO.widget.Tooltip('folk_gruppe_tip', {
				context:	dGruppeSpan,
				text:		'Velg en annen gruppe',
				showDelay:	400 });
		},
		failure: function(oAjaxResponse) {}
	};
	

	
	function _selectGroup() {
		var iSelectedGroup = _iCurrentGid;
		var aNodes;
		var cbGetGroupTree = {
			success: function(oAjaxResponse) { 
				// Init TreeView-objekt
	  			var gruppeTree = new YAHOO.widget.TreeView('dlgTreeDiv');
				aNodes = new Array();
				aNodes[0] = gruppeTree.getRoot();
				var aGrupper = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
				for (var i = 0; i < aGrupper.length; i++) {
					var oid = aGrupper[i].oid;
					var navn = aGrupper[i].navn;
					var parent = aGrupper[i].parent;
					var nodeObj = {
						label: navn,
						gid: oid
					};
					aNodes[oid] = new YAHOO.widget.TextNode(nodeObj, aNodes[parent], false);
				}
				gruppeTree.draw();
				// Expand ancestors of selected group
				var oCurrentNode = aNodes[iSelectedGroup];
				var iDepth = oCurrentNode.depth;
				for (var i=0; i<iDepth; i++) {
					oCurrentNode.getAncestor(i).expand();
				}
				// Hightlight the selected group
				YAHOO.util.Dom.addClass(oCurrentNode.getLabelEl(), 'node_highlight');
				gruppeTree.subscribe("labelClick", selectGroup);
			}
		};
		
		function initGetGroupTree() {
			var sUrl = "ajax.php?o=gruppeadm&f=gettree";
			sPost = '';
			var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, cbGetGroupTree, sPost);
		}
		
		function selectGroup(e, obj) {
			var iPrevGroup = iSelectedGroup;
			iSelectedGroup = e.data.gid;
			YAHOO.util.Dom.removeClass(aNodes[iPrevGroup].getLabelEl(), 'node_highlight');
			YAHOO.util.Dom.addClass(aNodes[iSelectedGroup].getLabelEl(), 'node_highlight');
		}
		
		function fOnAccept(e, obj) {
			_iCurrentGid = iSelectedGroup;
			_dataSource.sendRequest('gid='+iSelectedGroup, 
				_dataTable.onDataReturnInitializeTable,
				_dataTable);
			_initGroupSelect(iSelectedGroup);
			oDialog.hide();
		}
		
		
		var sDlgId = "folk_select_group_dlg";
		var sDlgHeading = "Velg en gruppe";
		var sDlgExplanation = '';
		var dTreeContainer = document.createElement('div');
		YAHOO.util.Dom.addClass(dTreeContainer, 'dlg_grouptree_container');
		var dTreeDiv = document.createElement('div');
		dTreeDiv.id = 'dlgTreeDiv';
		YAHOO.util.Dom.addClass(dTreeDiv, 'gruppe_tree');
		dTreeContainer.appendChild(dTreeDiv);
		// Create a toolbar
		var oCancelButton = CCOMM.control.iconButton('folk_select_group_dlg_cancel', false, 'close.png', 24);
		var oAcceptButton = CCOMM.control.iconButton('folk_select_group_dlg_accept', false, 'accept.png', 24);
		var oToolbar = CCOMM.control.toolBar('folk_select_group_dlg_tb', [oCancelButton, oAcceptButton], 1, 0, 10);
		var oPanelCfg = {
			visible:		false,
			draggable:		true,
			close:			true,
			modal:			true,
			effect:			{ effect: YAHOO.widget.ContainerEffect.FADE, duration:0.4},
			fixedcenter:	true
		};
		var oDialog = CCOMM.util.dialog(sDlgId, sDlgHeading, sDlgExplanation, dTreeContainer, oToolbar.getEl());
		// Attach event handlers to cancel and accept
		oCancelButton.setAction('click', oDialog.destroy);
		oAcceptButton.setAction('click', fOnAccept);
		initGetGroupTree();
		oDialog.show()
		
	};
	
	function _cbGroupSelect() {
		// Attach event handler to click on the folk_gruppe span
		var dFolkGruppe = YAHOO.util.Dom.get('folk_gruppe');
		YAHOO.util.Event.addListener('folk_gruppe', 'click', CCOMM.folk.selectGroup);
	}
	
	function _ehSelectAllRows(e, obj) {
		var oRecordSet = _dataTable.getRecordSet();
		var aRecords = oRecordSet.getRecords();
		var iNumRecords = aRecords.length;
		for (var i=0; i<iNumRecords; i++) {
			var dRow = _dataTable.getTrEl(aRecords[i])
			var dCheckbox = YAHOO.util.Dom.getElementsByClassName('yui-dt-checkbox', 'input', dRow)[0];
			// Check the checkbox
			dCheckbox.checked = true;
			// Select the row
			_dataTable.selectRow(aRecords[i]);
		}
	}  
	function _ehUnselectAllRows() {
		var oRecordSet = _dataTable.getRecordSet();
		var aRecords = oRecordSet.getRecords();
		var iNumRecords = aRecords.length;
		for (var i=0; i<iNumRecords; i++) {
			var dRow = _dataTable.getTrEl(aRecords[i])
			var dCheckbox = YAHOO.util.Dom.getElementsByClassName('yui-dt-checkbox', 'input', dRow)[0];
			// Check the checkbox
			dCheckbox.checked = false;
			// Select the row
			_dataTable.unselectRow(aRecords[i]);
		}
	} 
	
	

	
	// Constructor
	// Make this Controller available from CCOMM.session
	CCOMM.session.folkController = that;
	_iDefaultGid = 9992;
	_iCurrentGid = _iDefaultGid;
	var oSelectAllButton = new YAHOO.widget.Button("folk_selectall"); 
	oSelectAllButton.addListener("click", _ehSelectAllRows);
	var oUnselectAllButton = new YAHOO.widget.Button("folk_unselectall"); 
	oUnselectAllButton.addListener("click", _ehUnselectAllRows);
	
	var aButtons = [];
	oButtonSendEmail = CCOMM.control.iconButton("folk_sendemail", false, "mail.png", 24);
	oButtonSendEmail.setAction("click", function(e) {
		var oMsg = CCOMM.util.message("folk_sendemail_msg", "Kommer snart...", "Her vil du snart kunne sende epost til alle du har valgt i lista.<p style=\"margin-top: 8px\">&ndash; Håkon</p>");		
		oMsg.show();
	});
	oButtonSendEmail.setTooltip("Send epost til valgte personer");
	aButtons.push(oButtonSendEmail);
	
	oButtonSendSms = CCOMM.control.iconButton("folk_sendesms", false, "cellphone.png", 24);
	oButtonSendSms.setAction("click", function(e) {
		var oMsg = CCOMM.util.message("folk_sendsms_msg", "Kommer snart...", "Her vil du snart kunne sende SMS til alle du har valgt i lista.<p style=\"margin-top: 8px\">&ndash; Håkon</p>");		
		oMsg.show();
	});
	oButtonSendSms.setTooltip("Send SMS til valgte personer");
	aButtons.push(oButtonSendSms);
	oButtonAddPerson = CCOMM.control.iconButton("addperson", false, "adduser.png", 24);
	oButtonAddPerson.setAction("click", CCOMM.person.addPerson);
	oButtonAddPerson.setTooltip("Legg til person");
	aButtons.push(oButtonAddPerson);
	
	
	var _oToolbar = CCOMM.control.toolBar("folk_toolbar", aButtons, 1, 0, 10);
	YAHOO.util.Dom.get("folkactions").appendChild(_oToolbar.getEl());
	
	//var dSelectionButtons = document.createElement('div');
	//dSelectionButtons.innerHTML = 
	//	'<input type="button" id="folk_selectall" name="folk_selectall" value="Velg alle">' +
	//	'<input type="button" id="folk_selectall" name="folk_unselectall" value="Fjerne valg">';
	//YAHOO.util.Dom.get("folkactions").appendChild(dSelectionButtons);
	
	_aDetails = [];
	_loadTable();
	_initGroupSelect();
	
	// Attach event handler to click on the folk_gruppe span
	var dFolkGruppe = YAHOO.util.Dom.get('folk_gruppe');
	YAHOO.util.Event.addListener('folk_gruppe', 'click', _selectGroup);
	
	// Return instantiated object	
	return that;
};

/**
 * 
 */
 
CCOMM.folk.detail = function(pid, showWhenReady, eTriggeringEvent, oController) {
	var _panel;
	var _doc;
	var _ready;
	var _pid;
	var _showWhenReady;
	var _eTriggeringEvent;
	var _oPerson;
	var _bCurrentlyOpen;
	
	var that = {
		showPanel:		function(e, obj) {
			var oContainingDiv = document.createElement("div");
			oContainingDiv.id = "detail_"+_pid;
			YAHOO.util.Dom.get("misc").appendChild(oContainingDiv);
			var oPanelCfg = {
				visible:	false,
				draggable:	true,
				close:		true,
				modal:		false,
				effect:		{ effect: YAHOO.widget.ContainerEffect.FADE, duration:0.25}
				//x: 100,
				//y: 100 
			};
			_panel = new YAHOO.widget.Panel("detail_"+_pid, oPanelCfg);
			//this.panel.hideEvent.subscribe(this.panel.destroy);
			//var lPanel = this.realthis.panel;
			oController.overlayManager.register(_panel);
			//this.doc = this.oPerson.detaildoc;
			var oPanelContentDiv = document.createElement("div");
			var dTableContainer = document.createElement("div");
			dTableContainer.id = 'detail_'+_pid+'_tablewrapper';
			dTableContainer.innerHTML = _createMainTable();
			oPanelContentDiv.appendChild(dTableContainer);
						
			// Make buttons for the lower toolbar
			var aButtons = [];
			// Add "Avbryt"-button
			var oButtonCancel = CCOMM.control.iconButton("cancel_"+_oPerson.pid, false, "close.png", 24);
			
			oButtonCancel.setAction("click", that.hidePanel, _oPerson);
			oButtonCancel.setTooltip("Avbryt");
			aButtons.push(oButtonCancel);
			// Add "email"-button
			if (!_oPerson.epost !== "") {
				var oButtonEmail = CCOMM.control.iconButton("mail_"+_oPerson.pid, false, "mail.png", 24);
				//oButtonEmail.setAction("click", this.realthis.showEditPerson, oPerson);
				oButtonEmail.setTooltip("Send epost");
				aButtons.push(oButtonEmail);
			}		
			if (!_oPerson.tlfmob !== "") {
				var oButtonSms = CCOMM.control.iconButton("sms_"+_oPerson.pid, false, "cellphone.png", 24);
				//oButtonEmail.setAction("click", this.realthis.showEditPerson, oPerson);
				oButtonSms.setTooltip("Send SMS");
				aButtons.push(oButtonSms);
			}
			if (!_oPerson.bMayedit) {
				var oButtonEdit = CCOMM.control.iconButton("edit_"+_oPerson.pid, false, "edit.png", 24);
				oButtonEdit.setAction("click", that.showEditPerson, _oPerson);
				oButtonEdit.setTooltip("Endre kontaktinfo");
				aButtons.push(oButtonEdit);
			}
			var oButtonOk = CCOMM.control.iconButton("accept_"+_oPerson.pid, false, "accept.png", 24)
			oButtonOk.setAction("click", function(e, that) {_panel.hide();}, this);
			aButtons.push(oButtonOk);
			var oToolBar = CCOMM.control.toolBar("detail_toolbar"+_pid, aButtons, 1, 0); 
			oPanelContentDiv.appendChild(oToolBar.getEl());
			_panel.setHeader(_oPerson.fnavn);
			_panel.setBody(oPanelContentDiv);
			_panel.render();
			// Destroy panel after hide
			//_panel.hideEvent.subscribe(_panel.destroy);
			_ready = true;
				
			if (_ready) {
				/* @ccommtodo Forsøker å få detailpanel til å vises rett ved museklikk men dette fungerer ikke */
				_panel.cfg.setProperty("x", e.event.clientX+20);
				_panel.cfg.setProperty("y", e.event.clientY+20);
				_panel.render();
				_panel.show();
				_bCurrentlyOpen = true;
			} else {
				_showWhenReady = true;
			}
		},
		hidePanel:		function(e, obj) {
			_bCurrentlyOpen = false;
			_panel.hide();
		},
		showEditPerson:		function(e, oPerson) {
			var oEditPerson = CCOMM.person.editPerson(oPerson, true, that);
			oEditPerson.show();
		},
		/**
		 * Refresh the detail panel with information from the
		 * associated person object. Call this function when the person 
		 * has been saved.
		 */
		refresh:		function() {
			if (!_bCurrentlyOpen) {
				return;
			}
			var dTableContainer = YAHOO.util.Dom.get('detail_'+_pid+'_tablewrapper');
			dTableContainer.innerHTML = _createMainTable();
		}
	};
	
	function _createMainTable() {
		var sNavn = _oPerson.fnavn + ' ' + _oPerson.enavn;
		var sHtml = 
			'<table id="vcard_'+_oPerson.pid+'" class="vcard">'+
			'<tbody>'+
			'<tr id="vcard_row_upper">'+
			'<td id="vcard_td_pic" colspan="2">'+
			'<table>'+
			'<tr>'+
			'<td><img src="'+_oPerson.image+'" alt="bilde her"></td>'+
			'<td id="vcard_td_name">'+sNavn+'</td>'+
			'</tr>'+
			'</table>'+
			'</td>'+
			'</tr>';
		if (_oPerson.tlfmob != "") {
			sHtml += "<tr>\n<td class=\"left_col tlfmob\">Mobil:</td>\n<td class=\"right_col\">"+_oPerson.tlfmob+"</td>\n</tr>\n";
		}
		if (_oPerson.tlfhjem != "") {
			sHtml += "<tr>\n<td class=\"left_col tlfhjem\">Hjem:</td>\n<td class=\"right_col\">"+_oPerson.tlfhjem+"</td>\n</tr>\n";
		}
		if (_oPerson.adresse != "") {
			sHtml += "<tr>\n<td class=\"left_col address\">Adr:</td>\n<td class=\"right_col\">"+_oPerson.adresse;
			if ((_oPerson.postnr != "") && (_oPerson.sted != "")) {
				sHtml += "<br>"+_oPerson.postnr+" "+_oPerson.sted+"<br>";
				// Lag søkestreng for Google Maps
				var sQuerystring = "f=q%hl=no&geocode=&q=" + encodeURIComponent(_oPerson.adresse) + "+" + encodeURIComponent(_oPerson.sted);
				sHtml += "<a href=\"http://maps.google.no/maps?"+sQuerystring+"\" target=\"blank\">Google Maps</a>";
			}
			sHtml += "</td>\n</tr>\n";
		}
		
		
		if (_oPerson.epost != "") {
			sHtml += "<tr>\n<td class=\"left_col email\">Epost:</td>\n<td class=\"right_col\">"+_oPerson.epost+"</td>\n</tr>\n";
		}
		if (_oPerson.facebook != "") {
			
			var sFacebookUrl;
			var sProfileText = _oPerson.fnavn;
			if (_oPerson.facebook.substr(0,4) == "http") {
				sFacebookUrl = _oPerson.facebook;
			} else {
				sFacebookUrl = "http://www.facebook.com/profile.php?id="+_oPerson.facebook;
			}
			var reNameEnding = /s$/;
			if (!reNameEnding.test(sProfileText)) {
				sProfileText += "s";
			}
			sProfileText += " profil";
			sHtml += "<tr>\n<td class=\"left_col facebook\">Facebook:</td>\n<td class=\"right_col\"><a href=\""+sFacebookUrl+"\" target=\"blank\">"+sProfileText+"</a></td>\n</tr>\n";
		}
		sHtml += '</table>';
		return sHtml;
	}
	
	function _requestDoc() {
		var sUrl = "ajax.php?o=folk&f=getdetails";
		var sPost = "pid="+_pid;
		var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, _receiveDoc, sPost);	
	}
	
	var _receiveDoc = {
		success: function (oAjaxResponse) {
			_oPerson = CCOMM.person.entity(true, oAjaxResponse.responseText);
			CCOMM.session.persons[_oPerson.pid] = _oPerson;
			//_oPerson.bCreatedFromDetail = true;
			if (_showWhenReady) {
				that.showPanel(_eTriggeringEvent);
			}
		},
		failure: function (oAjaxResponse) {}
	};
	
	// Constructor		
	
	_pid = pid;
	_ready = false;
	_showWhenReady = showWhenReady;
	_eTriggeringEvent = eTriggeringEvent;
	_bCurrentlyOpen = false;
	_requestDoc();
	return that;
};








/*
CCOMM.folk.init = function () {
	var iDefaultGid = 211;
	
	function _selectAll(e, obj) {
		
	}
	
	function _unselectAll(e, obj) {
		
	}
	
	
	if (CCOMM.session.folk === undefined) {
		CCOMM.session.folk = {};
		CCOMM.session.folk.iCurrentGid = iDefaultGid;
	}
	var iCurrentGid = CCOMM.session.folk.iCurrentGid;
	CCOMM.folk.loadTable(iCurrentGid);
	CCOMM.folk.initGroupSelect(iCurrentGid);
	
	// Attach event handler to click on the folk_gruppe span
	var dFolkGruppe = YAHOO.util.Dom.get('folk_gruppe');
	YAHOO.util.Event.addListener('folk_gruppe', 'click', CCOMM.folk.selectGroup);
	
	// Create button to create new person
	var aButtons = [];
	oButtonAddPerson = CCOMM.control.iconButton("addperson", false, "adduser.png", 24);
	oButtonAddPerson.setAction("click", CCOMM.person.addPerson);
	aButtons.push(oButtonAddPerson);
	var _oToolbar = CCOMM.control.toolBar("folk_toolbar", aButtons, 2, 0);
	YAHOO.util.Dom.get("folkactions").appendChild(_oToolbar.getEl());
	var dSelectionButtons = document.createElement('div');
	dSelectionButtons.innerHTML = 
		'<input type="button" id="folk_selectall" name="folk_selectall" value="Velg alle">' +
		'<input type="button" id="folk_selectall" name="folk_unselectall" value="Fjerne valg">';
	YAHOO.util.Dom.get("folkactions").appendChild(dSelectionButtons);
	
	
};
*/

/*
CCOMM.folk.initGroupSelect = function(iGid) {
// Get the group path of the selected group
	var sUrl2 = "ajax.php?o=folk&f=getGroupPath";
	var sPost2 = "gid="+iGid;
	var oTrans2 = YAHOO.util.Connect.asyncRequest('POST', sUrl2, CCOMM.folk.loadGroupSelect, sPost2);
};
*/

/*
CCOMM.folk.loadGroupSelect = {
	success: function(oAjaxResponse) {
		var oResponse = oAjaxResponse.responseText.parseJSON();
		var dGruppeSpan = YAHOO.util.Dom.get('folk_gruppe');
		dGruppeSpan.innerHTML = oResponse['groupPath'];
		
		// Add stuff to get a hover effect
		fOnMouseover = function(e, dSpan) {
			YAHOO.util.Dom.addClass(dSpan, 'hover');
		}
		fOnMouseout = function(e, dSpan) {
			YAHOO.util.Dom.removeClass(dSpan, 'hover');
		}
		YAHOO.util.Event.addListener(dGruppeSpan, 'mouseover', fOnMouseover, dGruppeSpan);
		YAHOO.util.Event.addListener(dGruppeSpan, 'mouseout', fOnMouseout, dGruppeSpan);
		// Add tooltip
		var oTooltip = new YAHOO.widget.Tooltip('folk_gruppe_tip', {
			context:	dGruppeSpan,
			text:		'Velg en annen gruppe',
			showDelay:	400 });
	},
	failure: function(oAjaxResponse) {}
};
*/


/**
 * Event handler
 * Function that is called when the "Add person" button is clicked
 * Opens dialog to create a new person
 * @param {object} e Event object
 * @param {object} obj Object passed along to the object handler when listener was created
 * @return {void}
 */
CCOMM.person.addPerson = function(e, obj) {
	/*
	 * Description of the wizard CCOMM.person.addPerson
	 * 
	 * Step 1: ProvideName
	 * The user enters first name, last name and username for the new person.
	 * On next, C:Comm tries to save the person and bruker. If it fails, the
	 * user is given an error message and gets to try againg.
	 * 
	 * Step 2: AdditionalActions
	 * The name, username and password of the new user is presented.
	 * The logged in user may 
	 * enter an email adress to which this information is sent. There are three checkoff-boxes.
	 * 'Vil du sende epost til personen med denne informasjonen?' (koblet til input boks for epostadresse)
	 * 'Vil du oppgi kontaktinfo for personen?'
	 * 'Vil du legge til flere personer?'
	 * 
	 * 
	 */
	
	// declare private stuff
	this.oPerson = CCOMM.person.entity(false);
	// Instantiate the wizard object.
	this.oWizard = CCOMM.util.wizard("addPerson");
	this.oWizard.cfg.width = "400px";
	
	
	/**
	 * Singleton constructor
	 * Create step 1 ProvideName
	 */
	this.oProvideName = function() {
		// make object this available as object that to sub-objects
		var that = this;
		var heading = "Legg til person: Skriv inn navn";
		var div = document.createElement("div");
		var expl = '<p>Skriv inn fornavn og etternavn på personen.</p>' +
				'<p>Det blir automatisk foreslått et brukernavn bestående av initialer i fornavn og hele etternavnet.' +
				'Du kan endre det foreslåtte brukernavnet.</p>';
		var form = '<form id="addPersonF1" action="index.php" method="post">' +
				'<table class="form">' +
				'<tr>' +
				'<td><label for="fnavn">Fornavn:</label></td>' +
				'<td><input type="text" name="fnavn" id="ap_fnavn"></td>' +
				'</tr>' +
				'<tr>' +
				'<td><label for="enavn">Etternavn:</label></td>' +
				'<td><input type="text" name="enavn" id="ap_enavn"></td>' +
				'</tr>' +
				'<tr>' +
				'<td><label for="brnavn">Brukernavn:</label></td>' +
				'<td><input type="text" name="brnavn" id="ap_brnavn"></td>' +
				'</tr>';

		div.innerHTML = expl + form;
		/**
		 * Event handler
		 * Create brnavn from fnavn and enavn
		 */
		var _generateBrnavn = function (e, obj) {
			var dFnavn = YAHOO.util.Dom.get("ap_fnavn");
			var sFnavn = dFnavn.value;
			var dEnavn = YAHOO.util.Dom.get("ap_enavn");
			var sEnavn = dEnavn.value;
			var dBrnavn = YAHOO.util.Dom.get("ap_brnavn");
			// Generate brnavn
			var sBrnavn = "";
			var aFnavn = sFnavn.split(" ");
			for (i=0; i < aFnavn.length; i++) {
				sForstebokstav = aFnavn[i].substr(0,1);
				sBrnavn += sForstebokstav;
			}
			sBrnavn += sEnavn;
			sBrnavn = sBrnavn.toLowerCase();
			// substitute æøå by eoa
			sBrnavn = sBrnavn.replace(/æ/gi, "e");
			sBrnavn = sBrnavn.replace(/ø/gi, "o");
			sBrnavn = sBrnavn.replace(/å/gi, "a");
			dBrnavn.value = sBrnavn;
		}
		
		/**
		 * Event handler
		 */
		var onNext = function (e, obj) {
			// Parse tha values from from the form
			/* @ccommtodo Implement client side validation of data before sending to server */
			//var bValuesOk = true;
			//var aErrmsg = [];
			var dFnavn = YAHOO.util.Dom.get("ap_fnavn");
			var sFnavn = dFnavn.value;
			var dEnavn = YAHOO.util.Dom.get("ap_enavn");
			var sEnavn = dEnavn.value;
			var dBrnavn = YAHOO.util.Dom.get("ap_brnavn");
			var sBrnavn = dBrnavn.value;
			var oPostData = { fnavn: sFnavn, enavn: sEnavn, brnavn: sBrnavn };
			//_oPersonData = oPostData;
			sPostString = "jsondata=" + oPostData.toJSONString()
			that.oPerson.fnavn = sFnavn;
			that.oPerson.enavn = sEnavn;
			that.oPerson.brnavn = sBrnavn;
			var sUrl = "ajax.php?o=folk&f=addperson";
			var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, onNextCb, sPostString);		
		};
		
		/**
		 * Callback handler
		 */
		
		var onNextCb = {
			success:	function (oAjaxResponse) {
				var oResult = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
				if (!oResult['success']) {
					// The person was not saved
					if (oResult['errorcode'] === 1) {
						// The brnavn is already in use, show a message explainging this.
						var sMessage = oResult['errormsg'];
						var oMessage = CCOMM.util.message("some_error", "Personen kunne ikke lagres", sMessage);
						oMessage.show();
						return;
					}
				} else {
					// The person was successfully saved
					// Manipulate
					that.oPerson.passord = oResult['passord'];
					that.oPerson.pid = oResult['pid'];
					that.oAdditionalActions();
					that.oWizard.next(); 		
				}
			}
			
		};


		// Add eventlisteners to automaticaly generate brnavn
		YAHOO.util.Event.addListener("ap_fnavn", "keyup", _generateBrnavn);
		YAHOO.util.Event.addListener("ap_enavn", "keyup", _generateBrnavn);
		var oStep = this.oWizard.defaultStep();
		oStep.sId = "ProvideName";
		oStep.sHeading = heading;
		oStep.dBody = div;
		oStep.fOnNext = onNext;
		oStep.bEnablePrev = false;
		this.oWizard.addStep(oStep);
	};
	/*
	 * Step 2. AdditionalActions
	 */
	this.oAdditionalActions = function(){
		var that = this;
		heading = "Legg til person: " + this.oPerson.fnavn + " " + this.oPerson.enavn;
		div = document.createElement("div");
		
		expl = '<h3>Personen ble lagt til</h3>' +
			"<p>" + this.oPerson.fnavn + " " + this.oPerson.enavn +
			' kan nå logge seg inn med <br />' +
			'Brukernavn: ' + this.oPerson.brnavn + '<br />' +
			'Passord ' + this.oPerson.passord + '</p>' +
			'<h3>Hva vil du gjøre videre?</h3>';
		form = '<form id="AdditonalActions" action="index.php" method="post">' +
				'<table class="form">' +
				'<tr>' +
				'<td><input type="checkbox" id="ap_dosendemail"</td>' +
				'<td>Send epost med påloggingsinfo til ' + this.oPerson.fnavn + ' ' + this.oPerson.enavn +'</td>' +
				'</tr>' +
				'<tr id="ap_emailrow">' +
				'<td></td>' +
				'<td>Send til epostadressen:<br />' +
				'<input type="text" id="ap_emailaddress"></td>' +
				'<tr>' +
				'<td><input type="checkbox" id="ap_doentercontactinfo"></td>' +
				'<td>Legg til kontaktinformasjon</td>' +
				'</tr>' +
				'<tr>' +
				'<td><input type="checkbox" id="ap_doaddperson"></td>' +
				'<td>Legg til flere personer.</td>' +
				'</tr>';
		div.innerHTML = expl + form;
		
		
		/**
		 * Event handler
		 * Hide or show input box for emailaddress when the user clicks "ap_dosendemail"
		 */
		var _toggleVisibleEmailaddress = function (e, obj) {

			var dCheckbox = e.target;
			if (dCheckbox.checked) {
				YAHOO.util.Dom.setStyle("ap_emailrow", "display", "table-row");
			} else {
				YAHOO.util.Dom.setStyle("ap_emailrow", "display", "none");
			}
		} 
		
		var onFinish = function (e, obj) {
			// Parse tha values from from the form
			/* @ccommtodo Implement client side validation of data before sending to server */
			//var bValuesOk = true;
			//var aErrmsg = [];
			var bDoSendEmail = YAHOO.util.Dom.get("ap_dosendemail").checked;
			var bDoEnterContactinfo = YAHOO.util.Dom.get("ap_doentercontactinfo").checked;
			var bDoAddPerson = YAHOO.util.Dom.get("ap_doaddperson").checked;
			// If necessary, instantiate actionQueue
			if (CCOMM.session.actionQueue === undefined) {
				CCOMM.session.actionQueue = CCOMM.engine.actionQueue();
			} 
			if (bDoSendEmail) {
				that.oPerson.epost = YAHOO.util.Dom.get("ap_emailaddress").value;
				var fDoSendEmail = function() {
					CCOMM.util.emailNewUser(that.oPerson);
					CCOMM.session.actionQueue.doNext();
				};
				CCOMM.session.actionQueue.add(fDoSendEmail);
			}
			if (bDoEnterContactinfo) {
				var fDoEnterContactinfo = function() {
					var oEditPerson = CCOMM.person.editPerson(that.oPerson, false, null, true);
					oEditPerson.show();
					//CCOMM.session.actionQueue.doNext();
				};
				CCOMM.session.actionQueue.add(fDoEnterContactinfo);
			}
			if (bDoAddPerson) {
				var fDoAddPerson = function() {
					CCOMM.person.addPerson();
				};
				CCOMM.session.actionQueue.add(fDoAddPerson);
			}
			that.oWizard.oPanel.destroy();
			CCOMM.session.actionQueue.doNext();
		};
		// Attach event listeners
		YAHOO.util.Event.addListener("ap_dosendemail", "change", _toggleVisibleEmailaddress);
		
		var oStep = this.oWizard.defaultStep();
		oStep.sId = "AdditionalSteps";
		oStep.sHeading = heading;
		oStep.dBody = div;
		oStep.fOnFinish = onFinish;
		oStep.bEnableCancel = false;
		oStep.bEnablePrev = false;
		oStep.bEnableNext = false;
		oStep.bEnableFinish = true;
		this.oWizard.addStep(oStep);
	};
	
	/*
	 * Add the steps to the wizard object
	 */
	this.oProvideName();
	CCOMM.session.addPerson = this;
	this.oWizard.start();
	
};

/**
 * Static function. Test function for formatting of cells in a column
 * @member CCOMM.folk
 * @type void
 */
/*
CCOMM.folk.fnavnFormatter = function(elCell, oRecord, oColumn, oData) {
	var sHtml = '<span class="dt_fnavn">'+oData+'</span>';
	elCell.innerHTML = sHtml;
};
*/

/*
CCOMM.folk.initLoadTable = function(iGid) {
	// start ajax-request for å få tak i alle personene i ønsket gruppe
	var sUrl = "ajax.php?o=folk&f=getgroup";
	var sPost = "gid="+iGid;
	var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, CCOMM.folk.loadTable, sPost);
};
*/

/**
 * Callback object for @see CCOMM.folk.init
 */
/*
CCOMM.folk.loadTable = function(iGid) {
	var colDef = [
		{key:"fnavn", label:"Fornavn", sortable:true, formatter:CCOMM.folk.fnavnFormatter},
		{key:"enavn", label:"Etternavn", sortable:true},
		{key:"epost", label:"Epost"},
		{key:"tlfmob", label:"Mobiltelefon"},
		{label:"Velg", formatter:YAHOO.widget.DataTable.formatCheckbox}
	];
		
	var dataSource = new YAHOO.util.DataSource("ajax.php?o=folk&f=getgroup");
	dataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
	dataSource.connXhrMode = "queueRequests";
	dataSource.connMethodPost = true;
	dataSource.responseSchema = {
		resultsList: "ResultSet.Result",
		fields: ["pid","fnavn","enavn","epost","tlfmob"] 
	}; 
	// Create and configure properties on DataTable-object
	CCOMM.folk.dataTable = new YAHOO.widget.DataTable("folktable", colDef, dataSource, {initialRequest: "gid="+iGid});
	CCOMM.folk.dataTable.getColumn(0).resizeable = true;
	CCOMM.folk.dataTable.getColumn(0).width = "200px";
	// Subscribe to various events
	CCOMM.folk.dataTable.subscribe("cellClickEvent", CCOMM.folk.rowClick);
	CCOMM.folk.dataTable.subscribe("rowMouseoverEvent", CCOMM.folk.rowMouseover);
	// These turn on highlighting when pointer is placed over a row
	CCOMM.folk.dataTable.subscribe("rowMouseoverEvent", CCOMM.folk.dataTable.onEventHighlightRow); 
	CCOMM.folk.dataTable.subscribe("rowMouseoutEvent", CCOMM.folk.dataTable.onEventUnhighlightRow);
	CCOMM.folk.dataTable.subscribe("checkboxClickEvent", function(e){ 
		//YAHOO.util.Event.stopEvent(e.event);
		//var elCheckbox = oArgs.target; 
		//var elRecord = this.getRecord(elCheckbox); 
		//var name = elRecord.getData("field5"); 
		//alert("Checkbox was " + (elCheckbox.checked ? "" : "un") + "checked for " + name); 
	}); 




	CCOMM.session.folk.dataSource = dataSource;
	CCOMM.session.folk.dataTable = CCOMM.folk.dataTable;
	//	} else {
	/*
			CCOMM.session.folk.dataSource.liveData = CCOMM.session.folkTable;
			CCOMM.session.folk.dataTable.refresh();
			
			//CCOMM.session.folk.dataSource.flushCache();
			
	//	}
};
*/



/**
 * Collection object. Holds references to all detail objects.
 */
/*
CCOMM.folk.aDetails = {};
*/

/**
 * overlayManager object. Keep track of the detail panels. 
 */
/*
CCOMM.folk.overlayManager = new YAHOO.widget.OverlayManager();
*/

/**
 * @
 */
/*
CCOMM.folk.detail = function(pid, showWhenReady, eTriggeringEvent) {
	this.panel = undefined;
	var doc;
	this.ready = false;
	this.pid = pid;
	this.showWhenReady = showWhenReady;
	this.eTriggeringEvent = eTriggeringEvent;
	// Inne i underobjekt receiveDoc peker this til receiveDoc selv,
	// La this.realthis være en referanse til gjeldende instans av CCOMM.folk.detail
	this._receiveDoc.realthis = this;
	this._requestDoc();
}; 
*/

/**
 * Function. Initiates XHR fetching detail document.
 * @private
 * @member CCOMM.folk.detail
 * @type void
 */
/*
CCOMM.folk.detail.prototype._requestDoc = function () {
	var sUrl = "ajax.php?o=folk&f=getdetails";
	var sPost = "pid="+this.pid;
	var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, this._receiveDoc, sPost);	
};
*/

/**
 * Private callback object for @see CCOMM.folk.detail.prototype._requestDoc
 */
/*
CCOMM.folk.detail.prototype._receiveDoc = {
	success: function (oAjaxResponse) {
		this.realthis.oPerson = CCOMM.person.entity(true, oAjaxResponse.responseText);
		if (this.realthis.showWhenReady) {
			this.realthis.showPanel(this.realthis.eTriggeringEvent);
		}
	},
	failure: function (oAjaxResponse) {}
};
*/

/*
CCOMM.folk.detail.prototype.showPanel = function (e) {
	var oContainingDiv = document.createElement("div");
	oContainingDiv.id = "detail_"+this.oPerson.pid;
	YAHOO.util.Dom.get("misc").appendChild(oContainingDiv);
	var oPanelCfg = {
		visible:	false,
		draggable:	true,
		close:		true,
		modal:		false,
		effect:		{ effect: YAHOO.widget.ContainerEffect.FADE, duration:0.25}
		//x: 100,
		//y: 100 
	};
	this.panel = new YAHOO.widget.Panel("detail_"+this.oPerson.pid, oPanelCfg);
	//this.panel.hideEvent.subscribe(this.panel.destroy);
	//var lPanel = this.realthis.panel;
	CCOMM.folk.overlayManager.register(this.panel);
	//this.doc = this.oPerson.detaildoc;
	var oPanelContentDiv = document.createElement("div");
	
	var sNavn = this.oPerson.fnavn + ' ' + this.oPerson.enavn;
	var sHtml = 
		'<table id="vcard_'+this.oPerson.pid+'" class="vcard">'+
		'<tbody>'+
		'<tr id="vcard_row_upper">'+
		'<td id="vcard_td_pic" colspan="2">'+
		'<table>'+
		'<tr>'+
		'<td><img src="gfx/icons/person_bluecap_128.png" alt="bilde her"></td>'+
		'<td id="vcard_td_name">'+sNavn+'</td>'+
		'</tr>'+
		'</table>'+
		'</td>'+
		'</tr>';
	if (this.oPerson.tlfmob != "") {
		sHtml += "<tr>\n<td class=\"left_col tlfmob\">Mobil:</td>\n<td class=\"right_col\">"+this.oPerson.tlfmob+"</td>\n</tr>\n";
	}
	
	sHtml += '</table>';
	oPanelContentDiv.innerHTML = sHtml;
	
	
	
		// Make buttons for the lower toolbar
	var aButtons = [];
	// Add "Avbryt"-button
	var oButtonCancel = CCOMM.control.iconButton("cancel_"+this.oPerson.pid, false, "close.png", 24);
	//oButtonCancel.setAction("click", this.realthis.showEditPerson, oPerson);
	oButtonCancel.setTooltip("Avbryt");
	aButtons.push(oButtonCancel);
	// Add "email"-button
	if (!this.oPerson.epost !== "") {
		var oButtonEmail = CCOMM.control.iconButton("mail_"+this.oPerson.pid, false, "mail.png", 24);
		//oButtonEmail.setAction("click", this.realthis.showEditPerson, oPerson);
		oButtonEmail.setTooltip("Send epost");
		aButtons.push(oButtonEmail);
	}		
	if (!this.oPerson.tlfmob !== "") {
		var oButtonSms = CCOMM.control.iconButton("sms_"+this.oPerson.pid, false, "cellphone.png", 24);
		//oButtonEmail.setAction("click", this.realthis.showEditPerson, oPerson);
		oButtonSms.setTooltip("Send SMS");
		aButtons.push(oButtonSms);
	}
	if (!this.oPerson.bMayedit) {
		var oButtonEdit = CCOMM.control.iconButton("edit_"+this.oPerson.pid, false, "edit.png", 24);
		oButtonEdit.setAction("click", this.showEditPerson, this.oPerson);
		oButtonEdit.setTooltip("Endre kontaktinfo");
		aButtons.push(oButtonEdit);
	}
	var oButtonOk = CCOMM.control.iconButton("accept_"+this.oPerson.pid, false, "accept.png", 24)
	oButtonOk.setAction("click", function(e, that) {that.panel.hide();}, this);
	aButtons.push(oButtonOk);
	var oToolBar = CCOMM.control.toolBar("detail_toolbar"+this.pid, aButtons, 1, 0); 
	oPanelContentDiv.appendChild(oToolBar.getEl());
	this.panel.setHeader(this.oPerson.fnavn);
	this.panel.setBody(oPanelContentDiv);
	this.panel.render();
	this.ready = true;
		
	if (this.ready) {
		/* @ccommtodo Forsøker å få detailpanel til å vises rett ved museklikk men dette fungerer ikke */
		/*
		this.panel.cfg.setProperty("x", e.event.clientX+20);
		this.panel.cfg.setProperty("y", e.event.clientY+20);
		this.panel.render();
		this.panel.show();
	} else {
		this.showWhenReady = true;
	}
};
*/

/*
CCOMM.folk.detail.prototype.showEditPerson = function (e, oPerson) {
	var oEditPerson = CCOMM.person.editPerson(oPerson, true, this);
	oEditPerson.show();
};
*/

/*
CCOMM.folk.rowMouseover = function (e, obj) {
	//var recordId = e.target.yuiRecordId;
	var pid = CCOMM.session.folk.dataTable.getRecord(e.target).getData().pid;
	if ((typeof CCOMM.folk.aDetails[pid]) == "undefined") {
		CCOMM.folk.aDetails[pid] = new CCOMM.folk.detail(pid, false, e);
	};
	
};
*/

/*
CCOMM.folk.rowClick = function (e, obj) {
	var dataTable = CCOMM.session.folk.dataTable;
	//var recordId = e.target.parentNode.yuiRecordId;
	//console.log('recordId: '+recordId);
	var pid = CCOMM.session.folk.dataTable.getRecord(e.target).getData().pid;
	if (YAHOO.util.Dom.hasClass(e.event.originalTarget, 'yui-dt-checkbox')) {
		//if (e.event.target.checked)
		if (e.event.target.checked) {
			dataTable.selectRow(e.target);
		} else {
			dataTable.unselectRow(e.target);
		}
		return;
	}
	if ((typeof CCOMM.folk.aDetails[pid]) == "undefined") {
		CCOMM.folk.aDetails[pid] = new CCOMM.folk.detail(pid, true, e);
	} else {
		CCOMM.folk.aDetails[pid].showPanel(e);
	}
	
};
*/


/**
 * Event handler fired when the span folk_gruppe is clicked.
 * Opens a panel where the user selects a group.
 */
/*
CCOMM.folk.selectGroup = function(e, obj) {
	var iSelectedGroup = CCOMM.session.folk.iCurrentGid;
	var aNodes;
	var cbGetGroupTree = {
		success: function(oAjaxResponse) { 
			// Init TreeView-objekt
  			var gruppeTree = new YAHOO.widget.TreeView('dlgTreeDiv');
			aNodes = new Array();
			aNodes[0] = gruppeTree.getRoot();
			var aGrupper = oAjaxResponse.responseText.parseJSON();
			for (var i = 0; i < aGrupper.length; i++) {
				var oid = aGrupper[i].oid;
				var navn = aGrupper[i].navn;
				var parent = aGrupper[i].parent;
				var nodeObj = {
					label: navn,
					gid: oid
				};
				aNodes[oid] = new YAHOO.widget.TextNode(nodeObj, aNodes[parent], false);
			}
			//CCOMM.session.gruppeAdm.gruppeTree = gruppeTree;
			//CCOMM.session.gruppeAdm.aNodes = aNodes;
			gruppeTree.draw();
			// Expand ancestors of selected group
			var oCurrentNode = aNodes[iSelectedGroup];
			var iDepth = oCurrentNode.depth;
			for (var i=0; i<iDepth; i++) {
				oCurrentNode.getAncestor(i).expand();
			}
			// Hightlight the selected group
			YAHOO.util.Dom.addClass(oCurrentNode.getLabelEl(), 'node_highlight');
			gruppeTree.subscribe("labelClick", selectGroup);
		}
	};
	function initGetGroupTree() {
		var sUrl = "ajax.php?o=gruppeadm&f=gettree";
		sPost = '';
		var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, cbGetGroupTree, sPost);
	}
	
	function selectGroup(e, obj) {
		var iPrevGroup = iSelectedGroup;
		iSelectedGroup = e.data.gid;
		//console.dir(aNodes[iSelectedGroup]);
		//YAHOO.util.Dom.addClass()
		YAHOO.util.Dom.removeClass(aNodes[iPrevGroup].getLabelEl(), 'node_highlight');
		YAHOO.util.Dom.addClass(aNodes[iSelectedGroup].getLabelEl(), 'node_highlight');
	}
	
	function fOnAccept(e, obj) {
		CCOMM.session.folk.iCurrentGid = iSelectedGroup;
		//CCOMM.folk.initLoadTable(iSelectedGroup);
		CCOMM.session.folk.dataSource.sendRequest('gid='+iSelectedGroup, 
			CCOMM.session.folk.dataTable.onDataReturnInitializeTable,
			CCOMM.session.folk.dataTable);
		CCOMM.folk.initGroupSelect(iSelectedGroup);
		oDialog.hide();
	}
	
	var sDlgId = "folk_select_group_dlg";
	var sDlgHeading = "Velg en gruppe";
	var sDlgExplanation = '';
	var dTreeContainer = document.createElement('div');
	YAHOO.util.Dom.addClass(dTreeContainer, 'dlg_grouptree_container');
	var dTreeDiv = document.createElement('div');
	dTreeDiv.id = 'dlgTreeDiv';
	YAHOO.util.Dom.addClass(dTreeDiv, 'gruppe_tree');
	dTreeContainer.appendChild(dTreeDiv);
	// Create a toolbar
	var oCancelButton = CCOMM.control.iconButton('folk_select_group_dlg_cancel', false, 'close.png', 24);
	var oAcceptButton = CCOMM.control.iconButton('folk_select_group_dlg_accept', false, 'accept.png', 24);
	var oToolbar = CCOMM.control.toolBar('folk_select_group_dlg_tb', [oCancelButton, oAcceptButton], 1, 0, 10);
	var oPanelCfg = {
		visible:		false,
		draggable:		true,
		close:			true,
		modal:			true,
		effect:			{ effect: YAHOO.widget.ContainerEffect.FADE, duration:0.4},
		fixedcenter:	true
	};
	var oDialog = CCOMM.util.dialog(sDlgId, sDlgHeading, sDlgExplanation, dTreeContainer, oToolbar.getEl());
	// Attach event handlers to cancel and accept
	oCancelButton.setAction('click', oDialog.destroy);
	oAcceptButton.setAction('click', fOnAccept);
	initGetGroupTree();
	oDialog.show();
	
};
*/



var openpanel = function (e, obj) {
	alert("klikk");
	oPanel.render();
	oPanel.show();
};

function panelinit () {
	panel1 = new YAHOO.widget.Panel("panel1", { width:"320px", visible:false, constraintoviewport:true } );
	panel1.render();
	YAHOO.util.Event.addListener("show1", "click", panel1.show, panel1, true);
	YAHOO.util.Event.addListener("hide1", "click", panel1.hide, panel1, true);
	
	
	//YAHOO.util.Event.addListener("landingzone", "mouseover", openpanel);
}


/**
 * Solve cross-browser problems with how to access the target DOM object of
 * an event obect passed along to an event handler
 * @param {object} event Event object passed along to an event handler 
 */
CCOMM.lib.getEventTarget = function(event) {
	var dEventTarget = null;
	var testVar = typeof event.target;
	if ((typeof event.target) != "undefined") {
		// Firefox
		dEventTarget = event.target;
	} else if ((typeof event.srcElement) != "undefined") {
		// Internet Explorer
		dEventTarget = event.srcElement;
	}
	var dummy = true;
	return dEventTarget;
	
};

CCOMM.app = {};

CCOMM.app.File = function(_oInitData) {
	// shorthand
	var yDom = YAHOO.util.Dom;
	var yLayout = YAHOO.widget.Layout;
	var yTreeView = YAHOO.widget.TreeView;
	var yTextNode = YAHOO.widget.TextNode;
	var yHTMLNode = YAHOO.widget.HTMLNode;
	var yDataSource = YAHOO.util.DataSource;
	var yDataTable = YAHOO.widget.DataTable;
	
	
	// local variables
	var _oMainLayout;
	var _dFolderTree;
	var _oFolderTree;
	var _dInfo;
	var _dUpload;
	var _oRawFolders;
	var _oFileTable;
	var _oFileDataSource;
	
	
	function _ehFolderClick(nodeObj) {
		sPost = 'folder='+nodeObj.data.oid;
		_oFileDataSource.sendRequest(sPost, 
			_oFileDataTable.onDataReturnInitializeTable,
			_oFileDataTable);
	}
	
	function _buildApp() {
		var unitLeft = {
			position: 'left',
			width: 150,
			resize: true,
			body: '<div id="app_file_cont_dirtree"></div>',
			gutter: '0 5 0 2'
		};
		
		var unitCenter = {
			position: 'center',
			body: '<div id="app_file_filetable"></div>',
			gutter: '0 2 0 0'
		};
		var unitBottom = {
			position: 'bottom',
			height: 210,
			body: '<div id="app_file_cont_upload"></div>',
			gutter: '0 2 0 0'
		};
		
		var dLayoutContainer = CCOMM.session.cockpit.getAppWrap();
		_oMainLayout = new yLayout(dLayoutContainer, {
		    parent: CCOMM.session.cockpit.getCockpitLayout(),
		    units: [ unitLeft, unitCenter, unitBottom ]
		});
		_oMainLayout.render();
		_dFolderTree = yDom.get('app_file_cont_dirtree');
		_dInfo = yDom.get('app_file_cont_info');
		_dUpload = yDom.get('app_file_cont_upload');
	}
	
	function _recurseFolders(oRawFolder, oTreeParentNode) {
		var nodeObj = {
			label: 	oRawFolder['name'],
			oid:	oRawFolder['oid']
		};
		var oNode = new yTextNode(nodeObj, oTreeParentNode, false, true);
		if (oRawFolder.children != null) {
			// loop through children
			var iNumChildren = oRawFolder.children.length;
			for (var i=0; i<iNumChildren; i++) {
				_recurseFolders(oRawFolder.children[i], oNode);
			}
		}
	}
	
	function _buildFolderTree() {
		_oFolderTree = new yTreeView(_dFolderTree);
		var oRoot = _oFolderTree.getRoot();
		var iNumFoldersLevel1 = _oRawFolders.children.length;
		for (var i=0; i<iNumFoldersLevel1; i++) {
			_recurseFolders(_oRawFolders.children[i], oRoot);
		}
		_oFolderTree.draw();
		_oFolderTree.subscribe("labelClick", _ehFolderClick);
		
	}
	
	function _buildFileTable() {
		var colDef = [
			{key:"filename", label:"File name", sortable:true},
			{key:"oid", label:"Object ID", sortable:true}
		];
		_oFileDataSource = new yDataSource("ajax.php?o=appFile&f=getFileList&app=true");
		_oFileDataSource.responseType = yDataSource.TYPE_JSON;
		_oFileDataSource.connXhrMode = "queueRequests";
		_oFileDataSource.connMethodPost = true;
		_oFileDataSource.responseSchema = {
			resultsList: "files",
			fields: ["filename","oid"] 
		};
		_oFileTable = new yDataTable('app_file_filetable', colDef, _oFileDataSource, {initialRequest: "folder=10938"});
	}
	
	function _buildUploader() {
		var oUploader = CCOMM.util.fileUploader();
		oUploader.dContainer = yDom.get('app_file_cont_upload');
		oUploader.build(); 
	}
	
	function _testUploader() {
		var oUploader = CCOMM.util.fileUploader();
		
	}
	
	_oRawFolders = _oInitData['folderTree'];
	_buildApp();
	_buildFolderTree();
	_buildFileTable();
	_buildUploader();
};

CCOMM.app.Stats = function(_oInitData) {
	
};




CCOMM.cockpit = {};

CCOMM.cockpit.controller = function() {
	// shorthand
	var yConnect = YAHOO.util.Connect;
	var yDom = YAHOO.util.Dom;
	var yEvent = YAHOO.util.Event;
	var yLayout = YAHOO.widget.Layout;
	
	// local variables
	var _dTasks;
	var _dApp;
	var _cockpitLayout;
	
	// Public stuff
	var that = {
		getCockpitLayout: function() {
			return _cockpitLayout;
		},
		getAppWrap: function() {
			return _cockpitLayout.getUnitByPosition('center').get('wrap'); 
		}	
	};
	
	// Private methods
	
	function _requestApp(sAppName) {
		var sUrl = "ajax.php?o=cockpitengine&f=getapp";
		var sPost = 'appName='+sAppName;
		var oTrans = yConnect.asyncRequest('POST', sUrl, _receiveApp, sPost);
	}
	
	var _receiveApp = {
		success: function (oAjaxResponse) {
			// receive and store in local variables the initial data from the current app
			var oResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
			var sMarkup = oResponse['markup'];
			var initFunc = oResponse['initFunc'];
			var oInitData = oResponse['initData'];
			// Remove eventlisteners from content of 'wgt_app'
			yEvent.purgeElement(_dApp, true);
			// Set the html of the 'wgt_app' div to be the initial markup of the app
			_dApp.innerHTML = sMarkup;
			// Run the right app (identified by initFunc and pass along oInitData so it will initiate correctly
			CCOMM.app[initFunc](oInitData);
		},
		failure: function (oAjaxResponse) {}
	};
	
	function _requestTasks() {
			var sUrl = "ajax.php?o=cockpitengine&f=gettasks";
			var oTrans = yConnect.asyncRequest('POST', sUrl, _receiveTasks, '');
	}
	
	var _receiveTasks = {	
		success: function (oAjaxResponse) {
			var aResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
			var aTasks = aResponse['tasks'];
			var dList = document.createElement('ul');
			for (var i=0; i<aTasks.length; i++) {
				var oTask = aTasks[i];
				var dLi = document.createElement('li');
				dLi.innerHTML = oTask.lname;
				dList.appendChild(dLi);
			}
			yDom.get('wgt_tasks').appendChild(dList);
		},
		failure: function (oAjaxResponse) {}
	};
	
	
	function _buildCockpit() {
		var unitLeft = {
			position: 'left',
			width: 150,
			resize: true,
			body: '<div id="wgt_tasks" class="widget"></div>',
			gutter: '0 5 0 2'
		};
		
		var unitCenter = {
			position: 'center',
			body: '<div id="wgt_app" class="widget"></div>',
			gutter: '0 2 0 0'
		};
		
		_cockpitLayout = new yLayout('wgt_cockpit', {
		    units: [ unitLeft, unitCenter ]
		});
		_cockpitLayout.render();
		_dTasks = yDom.get('wgt_tasks');
		_dApp = yDom.get('wgt_app');
	}
	

	
	// Constructor
	
	_buildCockpit(); 
	_requestTasks();
	_requestApp('appFile');
	// make object accessible from other objects by storing in CCOMM.session
	CCOMM.session.cockpit = that;
};


CCOMM.oasis = {};

CCOMM.oasis.gmap = function() {
    var address = "24 N Mentor Ave, Pasadena CA 91106";
    var gmap = new GMap2(YAHOO.util.Dom.get("wgt_map"));
    var geocoder = new GClientGeocoder();
    console.log("map is loading");

  	geocoder.getLatLng(
    	address,
    	function(point) {
      		if (!point) {
        		alert(address + " not found");
      		} else {
        		gmap.setCenter(point, 13);
        		var marker = new GMarker(point);
        		gmap.addOverlay(marker);
        		marker.openInfoWindowHtml(
        		"<b>Oasis Church @ The Ice House</b><br/>"+
        		"24 N Mentor Ave<br/>"+
        		"Pasadena, CA 91106<br/>"+
        		"Phone # 626.394.6629"
        		);
      		}
    	}
  	);
  	gmap.addControl(new GSmallMapControl());
	//gmap.addControl(new GMapTypeControl());
    
    //gmap.setCenter(new GLatLng(37.4419, -122.1419), 13);
	
};

CCOMM.oasis.transpButton = function(sId, dContainer, sText, sStringpic, sPageid, sUrl, sJsfunction) {
	
	// shortcuts
	var yDom = YAHOO.util.Dom;
	var yEvent = YAHOO.util.Event; 
	
	// Declare private variabels
	var _dWrapper;			// div wrapping the img objects of button
	var _dBackground;		// img of the semitransparent button picture
	var _dStringpic;		// img of the stringpic
	var _sActionType;
	var _sActionParam;
	
	// Config settings
	var _sBtnNormal = "gfx/buttons/button.png";
	var _sBtnHover = "gfx/buttons/button_hover.png";
	var _sBtnPushed = "gfx/buttons/button_pushed.png";
	
	// Declare public properties and methods
	var that = {
	};
	// Declare private functions
	function _buildButton() {
		// Initiate wrapper
		_dWrapper = document.createElement('div');
		_dWrapper.id = sId;
		yDom.addClass(_dWrapper, 'ctl_transpbtn_wrapper')
		// Initiate background/button picture
		_dBackground = document.createElement('img');
		_dBackground.src = _sBtnNormal;
		yDom.addClass(_dBackground, 'ctl_transpbtn_background');
		// Initiate stringpic object
		_dStringpic = document.createElement('img');
		_dStringpic.src = "stringpic.php?guid="+ sStringpic;
		_dStringpic.alt = sText;
		yDom.addClass(_dStringpic, 'ctl_transpbtn_stringpic');
		// put dom nodes together
		_dWrapper.appendChild(_dBackground);
		_dWrapper.appendChild(_dStringpic);
		dContainer.appendChild(_dWrapper);
		//yDom.setX(yDom.getX(_dStringpic) - 200);
		// Configure click-action
		if (sPageid != "0") {
			_sActionType = "load_page";
			_sActionParam = sPageid;
		} else if (sUrl != "") {
			_sActionType = "goto_url";
			_sActionParam = sUrl;
		} else if (sJsfunction != "") {
			_sActionType = "run_function";
			_sActionParam = sJsfunction;
		} 
		
	}
	
	// Mouse-event handlers
	function _mouseover(e, obj) {
		_dBackground.src = _sBtnHover;
	}
	function _mouseout(e, obj) {
		_dBackground.src = _sBtnNormal;
	}
		function _mousedown(e, obj) {
		_dBackground.src = _sBtnPushed;
	}
	function _mouseup(e, obj) {
		_dBackground.src = _sBtnHover;
		// the mouseup event triggers the buttons assigned action
		switch (_sActionType) {
			case 'load_page':
				CCOMM.session.pageLoader.getPage(_sActionParam);
				break;
			case 'goto_url':
				window.location.assign(_sActionParam);
				break;
			case 'run_function':
				// not implemented
				break;
			default:
		}
	}
	  
	// Constructor
	_buildButton();
	// Assign eventhandlers
	yEvent.addListener([_dBackground, _dStringpic], "mouseover", _mouseover);
	yEvent.addListener([_dBackground, _dStringpic], "mouseout", _mouseout);
	yEvent.addListener([_dBackground, _dStringpic], "mousedown", _mousedown);
	yEvent.addListener([_dBackground, _dStringpic], "mouseup", _mouseup);
	
	// Return instantiated object	
	return that;
};

CCOMM.oasis.Teams = function() {
	// shorthand
	var yDom = YAHOO.util.Dom;
	//var yLayout = YAHOO.widget.Layout;
	var yTreeView = YAHOO.widget.TreeView;
	var yTextNode = YAHOO.widget.TextNode;
	var yHTMLNode = YAHOO.widget.HTMLNode;
	var yDataSource = YAHOO.util.DataSource;
	
	// local variables
	var _oTeamTree;
	
	
	/**
	 * Build the tree where the user picks sectors and teams
	 */
	function _buildTeamTree() {
		_oTeamTree = new yTreeView();
	}
	
};

CCOMM.oasis.flatMenu = function() {
	console.log('running flatmenu');
	// Shortcuts 
	var yDom = YAHOO.util.Dom;
	// Declare private variabels
	var _iPosX;
	var _iPosY;
	var _aItems;
	var _oOverlay;
	// Declare public properties and methods
	var that = {
	};
	// Declare private functions
	function _buildMenu() {
		var aOverlayConfig = {
			visible: true,
			//context: ['wgt_maincontent', 'tr', 'tr'],
			zIndex: 1000
		};
		_oOverlay = new YAHOO.widget.Overlay('flatmenu', aOverlayConfig);
		var dButtons = document.createElement('div');
		dButtons.id = 'flatmenu_buttons';
		for (var i in _aItems) {
			var oItem = _aItems[i];
			CCOMM.oasis.transpButton('flatmenu_button_'+i, dButtons, oItem.text, oItem.stringpic, oItem.pageid, oItem.url, oItem.jsfunction);
			
		}
		_oOverlay.setBody(dButtons);
	   	_oOverlay.render("wgt_flatmenu");
	   	/* @ccommtodo Positioning does not work right in Chrome and Safari. Ends up to far right. */
	   	var oRegion = yDom.getRegion("wgt_maincontent")
	   	yDom.setX(_oOverlay.element, oRegion.left + parseInt(_iPosX));
	   	yDom.setY(_oOverlay.element, oRegion.top + parseInt(_iPosY));
	}  
	// Constructor
	var oMenudata = CCOMM.data.metaData.flatmenu;
	_iPosX = oMenudata.posx;
	_iPosY = oMenudata.posy;
	_aItems = oMenudata.items;
	
	_buildMenu();
	// Return instantiated object	
	return that;
};

CCOMM.oasis.Podcast = function() {
		/*
	 * Standard class setup:
	 * 1. Declare private variable. Prefix names with underscore.
	 * 2. Declare the object 'that' where the members are public properties and
	 *    methods of the instantiated object.
	 * 3. Declare private functions. Prefix names with underscore.
	 * 4. Do construction stuff.
	 * 5. return that
	 * 
	 * Notes: 
	 * The object 'that' can now be referenced from anywhere within the object.
	 * 
	 */
	// Class template: 
	// shorthand
	var yDom = YAHOO.util.Dom;
	
	// Declare private variabels
	var _param;
	// Declare public properties and methods
	var that = {
	};
	/**
	 * Initiate jwplayers for each sermon
	 */
	function _initPlayer() {
		var aWrappers = yDom.getElementsByClassName('mp3player', 'div', 'lyt_podcast_leftcol');
		for (var i in aWrappers) {
			// loop through all the mp3player divs, extract info on oid and playtime and initiate jwplayer
			if (i != 'toJSONString') {
				var sOid = aWrappers[i].getAttribute('oid');
				var sPlaytime = aWrappers[i].getAttribute('playtime')
				var oPlayer = new SWFObject('addin/jwplayer/player.swf','ply','240','20','9','#ffffff');
				oPlayer.addParam('allowfullscreen', 'true');
				oPlayer.addParam('allowscriptaccess','always');
  				oPlayer.addParam('wmode','opaque');
  				oPlayer.addParam('flashvars','file=file/'+sOid+'.mp3&duration='+sPlaytime);
  				oPlayer.write('player_'+sOid);
			}
		}		
	}  
	// Constructor
	_initPlayer();
	_param = "example string";
	// Return instantiated object	
	return that;
};

CCOMM.oasis.pickPerson = function() {
	var _param;
	
	var _aAnimLarger = [];
	var _aAnimSmaller = [];
	var that = {
		
	};
	
	function _requestIntro(oid) {
		var sUrl = "ajax.php?o=introengine&f=getintro";
		var sPost = "oid="+oid;
		var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, _receiveIntro, sPost);
	}
	
	var _receiveIntro = {
		success: function (oAjaxResponse) {
			YAHOO.util.Dom.get('lyt_intros_rightcol').innerHTML = oAjaxResponse.responseText;
		},
		failure: function (oAjaxResponse) {
			
		}
	};	
	function _ehMouseOverThumb(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		var sId = dEventTarget.id;
		//YAHOO.util.Dom.addClass(dEventTarget, 'hover');
		_aAnimLarger[sId].animate();
	}
	
	function _ehMouseOutThumb(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		var sId = dEventTarget.id;
		//YAHOO.util.Dom.removeClass(dEventTarget, 'hover');
		_aAnimSmaller[sId].animate();
	}
	
	function _ehClickThumb(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		var sId = dEventTarget.id;
		// grab to oid of the intro from the id-string of the image
		var aIdComponents = sId.split("_", 2);
		var iOid = aIdComponents[1];
		_requestIntro(iOid);
	}
	
	
	
	function _addEventHandlers() {
		var aImages = YAHOO.util.Dom.getElementsBy(function(){return true;}, 'img', 'wgt_intros_pickperson');
		for (var i=0; i<aImages.length; i++) {
			if ((typeof aImages[i]) == "undefined") {
				continue;
			}
			oImage = aImages[i];

			// Create anims for image
			_aAnimLarger[oImage.id] = new YAHOO.util.Anim(oImage, {width: {to: 120}}, 0.15);
			_aAnimSmaller[oImage.id] = new YAHOO.util.Anim(oImage, {width: {to: 90}}, 0.15);
			
			YAHOO.util.Event.addListener(oImage, 'mouseover', _ehMouseOverThumb);
			YAHOO.util.Event.addListener(oImage, 'mouseout', _ehMouseOutThumb);
			YAHOO.util.Event.addListener(oImage, 'click', _ehClickThumb);
		}
		
	}
	
	_addEventHandlers();
	
};

CCOMM.oasis.give = function() {
		/*
	 * Standard class setup:
	 * 1. Declare private variable. Prefix names with underscore.
	 * 2. Declare the object 'that' where the members are public properties and
	 *    methods of the instantiated object.
	 * 3. Declare private functions. Prefix names with underscore.
	 * 4. Do construction stuff.
	 * 5. return that
	 * 
	 * Notes: 
	 * The object 'that' can now be referenced from anywhere within the object.
	 * 
	 */
	// Class template: 
	
	// Declare private variabels
	var _param;
	// Declare public properties and methods
	var that = {
	};
	// Declare private functions
	function _priv() {}  
	// Constructor
	_priv();
	_param = "example string";
	// Return instantiated object	
	return that;
};


CCOMM.oasis.oldGive = function() {
	var yDom = YAHOO.util.Dom;
	var yEvent = YAHOO.util.Event;
	
	var _iTotal;
	var _iDonationid;
	var _oDonateButton;
	var _oWizPanel;
	var _dPanelContainer;
	var _paypalInfoOk;
	var _giveitems
	
	function _ehChangeQuantity(e, oItem) {
		var dQuantity = yDom.get('quantity_'+oItem.itemid);
		var dAmount = yDom.get('amount_'+oItem.itemid);
		var sValue = dQuantity.value;
		// Check if the value is acceptable
		var oRe = /^\d*$/;
		if (!oRe.test(sValue)) {
			//The input box contains something besides a number
			var sMsg = "You have entered an invalid input: '" + sValue+"'<br/>";
			sMsg += "Please enter a number between 0 and " + oItem.max;
			var oMsg = CCOMM.util.message('give_msg', 'Invalid input', sMsg, false);
			oMsg.onClose(function() {oMsg.destroy();});
			oMsg.show();
			sValue = '';
			dQuantity.value = '';
		} else {
			if (sValue > oItem.max) {
				//The input number is too high
				var sMsg = "You have entered a too big quantity.<br/>";
				sMsg += "Please enter a number between 0 and " + oItem.max;
				var oMsg = CCOMM.util.message('give_msg', 'Too large quantity', sMsg, false);
				oMsg.onClose(function() {oMsg.destroy();});
				oMsg.show();
				sValue = oItem.max;
				dQuantity.value = oItem.max;
			}
		}
		if (sValue == '') {
			oItem.quantity = 0;
		} else {
			oItem.quantity = parseInt(sValue);
		}
		oItem.amount = oItem.quantity * oItem.price;
		dAmount.innerHTML = '$' + oItem.amount;
		_updateTotal();
	}
	
	function _ehFocusInput(e, oItem) {
		var dQuantity = yDom.get('quantity_'+oItem.itemid);
		yDom.addClass(dQuantity, "elmt_give_focus");
		dQuantity.select();
	}
	
	function _ehBlurInput(e, oItem) {
		var dQuantity = yDom.get('quantity_'+oItem.itemid);
		yDom.removeClass(dQuantity, "elmt_give_focus");
	}
	
	function _ehBaseClickDonate(e, obj) {
		var yButton = YAHOO.widget.Button;
		var yDom = YAHOO.util.Dom;
		var yPanel = YAHOO.widget.Panel;

		_dPanelContainer = document.createElement('div');
		_dPanelContainer.id = 'give_panelcontainer';
		yDom.get('misc').appendChild(_dPanelContainer);
		
		var oPanelCfg = {
			visible:	false,
			draggable:	true,
			close:		false,
			modal:		true,
			fixedcenter:	true,
			effect:		{ effect: YAHOO.widget.ContainerEffect.FADE, duration:0.25}
		};
		_oWizPanel = new yPanel(_dPanelContainer.id, oPanelCfg);
		var sWizHeader = 'Confirm donation';
		var dWizContent = document.createElement('div');
		yDom.setStyle(dWizContent, 'width', '300px');
		var sExpl = '<p>You have chosen to donate $' + _iTotal +' to Oasis Church.</p>';
		sExpl += '<p>You can transfer money by mailing a check or pay online from Credit Card or PayPal account.</p>';
		sExpl += '<p>Press Cancel if you do not want to go through with the donation.</p>';

		var oWizToolbar = document.createElement('div');
		yDom.setStyle(oWizToolbar, 'text-align', 'center');
		
		var oBtnCheck = new yButton({
			label: "Check",
			id: "give_btn_check",
			container: oWizToolbar});
		oBtnCheck.addListener('click', _ehChooseCheck);
		var oBtnPaypal = new yButton({
			label: "Credit Card or PayPal",
			id: "give_btn_paypal",
			container: oWizToolbar 
		});
		oBtnPaypal.addListener('click', _ehChoosePaypal);	
		var oBtnCancel = new yButton({
			label: "Cancel",
			id: "give_btn_cancel",
			container: oWizToolbar 
		});
		oBtnCancel.addListener('click', _ehChooseCancel);
		
		dWizContent.innerHTML = sExpl;
		
		dWizContent.appendChild(oWizToolbar);
		_oWizPanel.setHeader(sWizHeader);
		_oWizPanel.setBody(dWizContent);
		_oWizPanel.render();
		_oWizPanel.show();
	}
	
	function _ehChooseCheck(e, obj) {
		_infoProcessing();
		_commitDonation('check');
	}
	
	function _ehChoosePaypal(e, obj) {
		_infoProcessing();
		_commitDonation('paypal');
	}
	
	function _ehChooseCancel(e, obj) {
		_finishWizard();
	}
	
	function _finishWizard() {
		_oWizPanel.hide();
		_oWizPanel.destroy();
		_oWizPanel = undefined;
		CCOMM.util.removeFromDom(_dPanelConainer);
	}
	
	function _infoProcessing() {
		var dWizContent = document.createElement('div');
		var sHtml = '<p>Processing... please wait.</p>' +
			'<div style="text-align: center"><img src="gfx/loading.gif" /></div>';
		dWizContent.innerHTML = sHtml;
		_oWizPanel.setHeader('Processing');
		_oWizPanel.setBody(dWizContent);
		_oWizPanel.render();
		_oWizPanel.show();	
	}
	
	function _showDlgCheck() {
		var yButton = YAHOO.widget.Button;
		var dWizContent = document.createElement('div');
		yDom.setStyle(dWizContent, 'width', '320px');
		var sHtml = 'Please write out a check in the amount<br/>' +
			'<span style="font-weight: bold">$ '+_iTotal+'.00</span><br/>'+
			'to<br/>'+
			'<span style="font-weight: bold">'+
			'Oasis Church</span><br/><br/>'+
			'and send it to'+
			'<div style="font-weight: bold">'+
			'Oasis Church c/o Jon Maurer<br/>'+
			'P.O. Box 9521 Unit 5001<br/>'+
			'Azusa CA 91702</div></br>'+
			'<p>Include the reference number <span style="font-weight: bold">"'+_iDonationid+'"</span> on the check, '+
			'so we know which items you donation will finance.</p>'+
			'<p><input id="give_sendreceipt" type="checkbox" checked="checked" value="true">'+
			'Check if you want Oasis Church to send you a tax receipt for your gift.</p>';
		var dToolbar = document.createElement('div');
		yDom.setStyle(dToolbar, 'text-align', 'center');
		var oBtnFinish = new yButton({
			label: "Finish",
			id: "give_btn_finish",
			container: dToolbar});
		oBtnFinish.addListener('click', _ehFinishDlgCheck);
		dWizContent.innerHTML = sHtml;
		dWizContent.appendChild(dToolbar);
		_oWizPanel.setHeader('Please write out check');
		_oWizPanel.setBody(dWizContent);
		_oWizPanel.render();
		_oWizPanel.show();
			
	}
	
	function _ehFinishDlgCheck(e, obj) {
		var yDom = YAHOO.util.Dom;
		if (yDom.get('give_sendreceipt').checked) {
			var sPost = "sendreceipt=true";
		} else {
			var sPost = "sendreceipt=false";
		}
		// send message to server that person wants receipt
		var sUrl = "ajax.php?o=giveengine&f=saveCheckInfo";
		var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, _cbSaveCheckInfo, sPost);
		CCOMM.session.pageLoader.getPage(11076);
		_finishWizard();
		
	}
	
	function _showDlgPaypal() {
		var yEvent = YAHOO.util.Event;
		var yButton = YAHOO.widget.Button;
		var yDom = YAHOO.util.Dom;
		var dWizContent = document.createElement('div');
		yDom.setStyle(dWizContent, 'width', '360px');
		var sHtml = '<p><input id="give_sendreceipt" type="checkbox" checked="checked" value="true">'+
			'Check if you want Oasis Church to send you a tax receipt for your gift.</p>';
		var sFormTemplate = '<form id="give_paypalform" action="index.php" method="post">' +
			'<p>In order to send you the tax receipt, we need your name and address. All the following fields are required.</p>' +
			'<div class="enablecursor"><table class="form">' +
			'<tr>' +
			'<td class="label"><label for="lname">First name:</label></td>' +
			'<td><input type="text" name="lname" id="give_fname" value="" size="{dftinputw}"></td>' +
			'</tr>' +
			'<tr>' +
			'<td class="label"><label for="enavn">Last name:</label></td>' +
			'<td><input type="text" name="enavn" id="give_lname" value="" size="{dftinputw}"></td>' +
			'</tr>' +
			'<tr>' +
			'<td class="label"><label for="address:">Street address:</label></td>' +
			'<td><input type="text" name="address" id="give_address" value="" size="{dftinputw}"></td>' +
			'</tr>' +
			'<tr>' +
			'<td class="label"><label for="city">City:</label></td>' +
			'<td><input type="text" name="city" id="give_city" value="" size="{dftinputw}"></div></td>' +
			'</tr>' +
			'<tr>' +
			'<td class="label"><label for="state">State:</label></td>' +
			'<td><input type="text" name="state" id="give_state" value="" size="{dftinputw}"></td>' +
			'</tr>' +
			'<tr>' +
			'<td class="label"><label for="zip">Zip:</label></td>' +
			'<td><input type="text" name="zip" id="give_zip" value="" size="{dftinputw}"></td>' +
			'</tr>' +
			'</table></div>' +
			'</form>';
		var dFormContainer = document.createElement("div");
		var oFormOptions = {
			'dftinputw':	'30'
		}
		dFormContainer.innerHTML = sFormTemplate.supplant(oFormOptions);
		dWizContent.innerHTML = sHtml;
		dWizContent.appendChild(dFormContainer);
		yEvent.addListener('give_sendreceipt', 'change', _togglePaypalReceipt);
		
		//yEvent.addListener('give_sendreceipt', 'click', _togglePaypalReceipt);
		
		// Paypal-forwarding
		var sPaypal = 
			'<p>When you click the "Donate" button below you are taken to PayPal\'s website where you can transfer money from your credit card.</p>'+
			'<div style="text-align: center; margin-top: 10px;">'+
			'<form action="https://www.paypal.com/cgi-bin/webscr" method="post">'+
			'<input type="hidden" name="cmd" value="_donations">'+
			'<input type="hidden" name="business" value="{business}">'+
			'<input type="hidden" name="item_name" value="{item_name}">'+
			'<input type="hidden" name="item_number" value="{item_number}">'+
			'<input type="hidden" name="amount" value="{amount}">'+
			'<input type="hidden" name="no_shipping" value="0">'+
			'<input type="hidden" name="return" value="{returnurl}">'+
			'<input type="hidden" name="no_note" value="1">'+
			'<input type="hidden" name="currency_code" value="USD">'+
			'<input type="hidden" name="tax" value="0">'+
			'<input type="hidden" name="lc" value="US">'+
			'<input type="hidden" name="bn" value="PP-DonationsBF">'+
			'<input type="image" id="give_paypaldonate" src="https://www.paypal.com/en_US/i/btn/btn_donateCC_LG.gif" border="0" name="submit" alt="PayPal - The safer, easier way to pay online!">'+
			'<img alt="" border="0" src="https://www.paypal.com/en_US/i/scr/pixel.gif" width="1" height="1">'+
			'</form>'
			'</div>';
		var oPaypalOptions = {
			'business':		'oasispasadena@gmail.com',
			'item_name':	'Donation to Oasis Church',
			'item_number':	_iDonationid.toString(),
			'amount':		_iTotal+'.00',
			'returnurl':	'http://www.oasispasadena.org/?pn=give'
		};
		var dPaypalCont = document.createElement('div');
		dPaypalCont.innerHTML = sPaypal.supplant(oPaypalOptions);
		dWizContent.appendChild(dPaypalCont);
		
		
		_oWizPanel.setHeader('Tax receipt');
		_oWizPanel.setBody(dWizContent);
		_oWizPanel.render();
		_oWizPanel.show();
		// add eventlisteners to check content and allow/disallow donate
		var aInputs = yDom.getElementsBy(function() { return true; }, 'input', 'give_paypalform'); 
		yEvent.addListener(aInputs, "keyup", _ehEditPaypalform);
		// Call method to make sure the paypal donate button is properly enabled or disabled
		_ehEditPaypalform();
		yEvent.addListener('give_paypaldonate', 'click', _ehPaypalDonateClick);
	}
	
	function _togglePaypalReceipt(e, obj) {
		var yDom = YAHOO.util.Dom;
		if (yDom.get('give_sendreceipt').checked) {
			// Want receipt, enable form
			yDom.setStyle('give_paypalform', 'visibility', 'visible');
		} else {
			yDom.setStyle('give_paypalform', 'visibility', 'hidden');
		}
		// Call method to make sure the paypal donate button is properly enabled or disabled
		_ehEditPaypalform();
	}
	
	function _toggleCheckReceipt(e, obj) {
		
	}
	
	function _ehEditPaypalform(e, obj) {
		var yDom = YAHOO.util.Dom;
		var yEvent = YAHOO.util.Event;
		var bOk = true;
		var sFname = yDom.get('give_fname').value;
		var sLname = yDom.get('give_lname').value;
		var sAddress = yDom.get('give_address').value;
		var sCity = yDom.get('give_city').value;
		var sState = yDom.get('give_state').value;
		var sZip = yDom.get('give_zip').value;
		if (sFname.length == 0 || sLname.length == 0 || sAddress.length == 0 || sCity.length == 0 || sState.length == 0 || sZip.length == 0) {
			bOk = false;
		}
		if (bOk) {
			//yDom.get('give_paypaldonate').disabled = 'false';
			_paypalInfoOk = true;
		} else {
			if (yDom.get('give_sendreceipt').checked) {
				_paypalInfoOk = false;
			} else {
				_paypalInfoOk = true;
			}
		}
	}
	
	function _ehPaypalDonateClick(e, obj) {
		// When the user clicks the button, this method is fired first, the the user is sent to paypal
		if (!_paypalInfoOk) {
			
			var sMsg = "You need to fill in name and address properly before you can continue.<br/>";
			var oMsg = CCOMM.util.message('give_msg', 'Too large quantity', sMsg, false);
			oMsg.onClose(function() {oMsg.destroy();});
			oMsg.show();
			YAHOO.util.Event.stopEvent(e);
		}
		// Gather info from form and send to server
		if (yDom.get('give_sendreceipt').checked) {
			bSendreceipt = true;
		} else {
			bSendreceipt = false;
		}
		
		var oMailInfo = {
			'fname' :	yDom.get('give_fname').value,
			'lname' :	yDom.get('give_lname').value,
			'address' :	yDom.get('give_address').value,
			'city' : 	yDom.get('give_city').value,
			'state' : 	yDom.get('give_state').value,
			'zip' : 	yDom.get('give_zip').value
		};
		var sUrl = "ajax.php?o=giveengine&f=savePaypalInfo";
		var sPost = "sendreceipt=" + bSendreceipt + "&mailinfo=" + YAHOO.lang.JSON.stringify(oMailInfo);
		var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, _cbSavePaypalInfo, sPost);
		// stop event for debugging
		//YAHOO.util.Event.stopEvent(e);
	}
	
	function _commitDonation(sPayby) {
		var items = [];
		for (var i in _giveitems) {
			item = _giveitems[i];
			items[item.itemid] = {
				itemid: item.itemid,
				quantity: item.quantity
			};
		}
		// Send request to server
		var sUrl = "ajax.php?o=giveengine&f=processDonation";
		var sPost = "items=" + YAHOO.lang.JSON.stringify(items);
		var sPost = sPost + "&payby=" + sPayby;
		var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, _cbCommitDonation, sPost);
	}
	
	var _cbCommitDonation = {
		success: function(oAjaxResponse) {
			var oResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
			if (!oResponse['success']) {
				//something went wrong
			} else {
				_iDonationid = oResponse['donationid'];
				if (oResponse['payby'] == 'check') {
					_showDlgCheck();
				} else if (oResponse['payby'] == 'paypal') {
					_showDlgPaypal();
				}
			}
		},
		failure: function(oAjaxResponse) {	
		}
	};
		
	var _cbSavePaypalInfo = {
		success: function(oAjaxResponse) {
			var oResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
			if (!oResponse['success']) {
				//something went wrong
			} else {
			}
		},
		failure: function(oAjaxResponse) {	
		}
	};
	
	var _cbSaveCheckInfo = {
		success: function(oAjaxResponse) {
			var oResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
			if (!oResponse['success']) {
				//something went wrong
			} else {
			}
		},
		failure: function(oAjaxResponse) {	
		}
	};
	
	function _updateTotal() {
		_iTotal = 0;
		for (var i in _giveitems) {
			item = _giveitems[i];
			
			if ((typeof item.amount) != "undefined") {
				_iTotal += item.amount;
			}
		}
		yDom.get('give_total').innerHTML = '$' + _iTotal;
	}
	
	var _cbGetItems = {
		success : function(oAjaxResponse) {
			var oResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
			_giveitems = oResponse['items'];
			var dItemTable = YAHOO.util.Dom.get('elmt_give_itemtable');
			//attach eventhandlers
			for (var i in _giveitems) {
				item = _giveitems[i];
				// Handle input from keyboard into input
				var dInput = yDom.get('quantity_'+item.itemid);
				yEvent.addListener(dInput, "keyup", _ehChangeQuantity, item);
				// Select content of box when focused and blurred
				yEvent.addListener(dInput, "focus", _ehFocusInput, item);
				yEvent.addListener(dInput, "blur", _ehBlurInput, item);
			}
			_iTotal = 0;
		},
		failure : function(oAjaxResponse) {
			
		}
	};
	
	
	
	//request items object
	var sPost = "arg1=dummy";
	var sUrl = "ajax.php?o=giveengine&f=getItems";
	var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, _cbGetItems, sPost);
	
	// Initialize Donate button
	_oDonateButton = new YAHOO.widget.Button("give_btn_donate");
	_oDonateButton.addListener("click", _ehBaseClickDonate);
	
};

CCOMM.oasis.getinvolved = function() {
	
	//shorthand
	var yDom = YAHOO.util.Dom;
	var yTreeView = YAHOO.widget.TreeView;
	var yMenuNode = YAHOO.widget.MenuNode;
	
	// Declare private variabels
	var _oTeamTree;
	// Declare public properties and methods
	var that = {
	};
	// Declare private functions
	
	// Request arrays of sectors and teams
	function _loadTeamTree() {
		var sUrl = "ajax.php?o=getinvolvedengine&f=getTeams";
		var sPost = "";
		var oTrans = YAHOO.util.Connect.asyncRequest('POST', sUrl, _cbLoadTeamTree, sPost);
	}
	
	
	var _cbLoadTeamTree = {
		success: function(oAjaxResponse) {
			var aResponse = YAHOO.lang.JSON.parse(oAjaxResponse.responseText);
			_buildTeamTree(aResponse['sectors'], aResponse['teams']);
		},
		failure: function(oAjaxResponse) {	
		}
	}
	
	function _buildTeamTree(aSectors, aTeams) {
		_oTeamTree = new yTreeView("elmt_getinvolved_teamtree");
		var oRoot = _oTeamTree.getRoot();
		for (var sectoroid in aSectors) {
			var nodeObj = {
				label:	aSectors[sectoroid].name,
				oid:	sectoroid
			};
			var oNode = new yMenuNode(nodeObj, oRoot, false, true); 
			for (var teamoid in aTeams) {
				if (aTeams[teamoid].sector == sectoroid) {
					var teamNodeObj = {
						label:	aTeams[teamoid].name,
						oid:	teamoid
					};
					var teamNode = new yMenuNode(teamNodeObj, oNode, false, true);
				}
			}
		}
		_oTeamTree.draw();
	}  
	
	
	// Constructor
	_loadTeamTree();	
	
};


CCOMM.oasis.banner = function() {
	/*
	 * Standard class setup:
	 * 1. Declare private variable. Prefix names with underscore.
	 * 2. Declare the object 'that' where the members are public properties and
	 *    methods of the instantiated object.
	 * 3. Declare private functions. Prefix names with underscore.
	 * 4. Do construction stuff.
	 * 5. return that
	 * 
	 * Notes: 
	 * The object 'that' can now be referenced from anywhere within the object.
	 * 
	 */
	// Class template: 
	
	// Declare private variabels
	var _param;
	var _firstPic;
	var _currentPic;
	var _dBanner;
	var _currentPageid;
	var _currentLink;
	// Declare public properties and methods
	var that = {
		rotate:		function() {
			_dBanner.src = _currentPic.src;
			_currentPageid = _currentPic.pageid;
			_currentLink = _currentPic.link;
			_currentPic = _currentPic.next;
			
			setTimeout("CCOMM.session.banner.rotate()", 15000);
		}
	};
	// Declare private functions
	
	function _ehClickBanner(e, obj) {
		if (_currentPageid != 0) {
			CCOMM.session.pageLoader.getPage(_currentPageid);
		} else {
			window.location.assign(_currentLink);
		}
	}
	
	function _createPictureList() { 
		var newPic = {
			//internship info
			src: 'file/12050',
			pageid: 0,
			link: 'file/12049'
		};
		_firstPic = newPic;
		prevPic = newPic;
		
		newPic = {
			//introvideo
			src: 'file/11152',
			pageid: 11151,
			link: ''
		};
		
		prevPic.next = newPic;
		prevPic = newPic;
		
//		newPic = {
//			//intros
//			src: 'file/11080',
//			pageid: 10992,
//			link: ''
//		};
//		prevPic.next = newPic;
//		prevPic = newPic;
		
		newPic = {
			//hospitality
			src: 'file/11079',
			pageid: 10990,
			link: ''
		};
		prevPic.next = newPic;
		prevPic = newPic;
		
		/*newPic = {
			//random
			src: 'file/11081',
			pageid: 11004
		};
		prevPic.next = newPic;
		prevPic = newPic;*/
		
		newPic = {
			//contact
			src: 'file/11078',
			pageid: 11017,
			link: ''
			
		};
		prevPic.next = newPic;
		newPic.next = _firstPic;
		_currentPic = _firstPic;
	}  
	// Constructor
	_createPictureList();
	_dBanner = document.createElement('img');
	YAHOO.util.Dom.get('wgt_banner').appendChild(_dBanner);
	YAHOO.util.Event.addListener(_dBanner, 'click', _ehClickBanner);
	that.rotate();
	return that;
};


CCOMM.oasis.imageLoader = function(iInterval) {
	
	var _oFirstLink = null;
	var _oLastLoaded;

	
	function _createLinkedList() {
		var aPageData = CCOMM.data.pages;
		var oCurrentLink = null;
		for (var i in aPageData) {
			if ((typeof aPageData[i]) != "undefined") {
				if (aPageData[i].bPreview) {
					if (_oFirstLink == null) {
						_oFirstLink = {
							pageid:	i,
							sPreviewURL: aPageData[i].sPreviewURL,
							next: null
						};
						oCurrentLink = _oFirstLink;
					} else {
						oCurrentLink.next = {
							pageid:	i,
							sPreviewURL: aPageData[i].sPreviewURL,
							next: null
						};
						oCurrentLink = oCurrentLink.next;
					}
				}
			}
		}
	}
	
	var that = {
		loadNext:		function() {
			if (_oLastLoaded != null) {
				var oCurrentPage = _oLastLoaded.next;
			} else {
				var oCurrentPage = _oFirstLink;
			}
			if (oCurrentPage != null) {
				var dImg = document.createElement('img');
				dImg.src = oCurrentPage.sPreviewURL;
				CCOMM.session.imageCache[oCurrentPage.pageid] = dImg;
				_oLastLoaded = oCurrentPage
				// the context of whatever is run by setTimeout is the global namespace so it has to call
				// something that is accessible from there
				setTimeout("CCOMM.session.imageLoader.loadNext()", iInterval);
			}
		}
	};
	
	CCOMM.session.imageCache = {};
	_createLinkedList();
	that.loadNext();
	return that;
	
};

CCOMM.oasis.homepage = {};

CCOMM.oasis.homepage.controller = function(parameter) {
	/*
	 * Standard class setup:
	 * 1. Declare private variable. Prefix names with underscore.
	 * 2. Declare the object 'that' where the members are public properties and
	 *    methods of the instantiated object.
	 * 3. Declare private functions. Prefix names with underscore.
	 * 4. Do construction stuff.
	 * 5. return that
	 * 
	 * Notes: 
	 * The object 'that' can now be referenced from anywhere within the object.
	 * 
	 */
	// Class template: 
	
	// Declare private variabels
	var _param;
	// Declare public properties and methods
	var that = {
	};
	// Declare private functions
	function _ehButtonClick(e, oPassAlong) {
		
		CCOMM.session.pageLoader.getPage(oPassAlong.pageid);
	}
	
	function _buildbuttons() {
		var oContactBtn = CCOMM.control.imgButton('btn_contact', true, 'gfx/buttons/contact.png', 'gfx/buttons/contact_hover.png', 'gfx/buttons/contact_pushed.png');
		oContactBtn.setAction('click', _ehButtonClick, {pageid: '11017'});
		var oGiveBtn = CCOMM.control.imgButton('btn_give', true, 'gfx/buttons/givetooasis.png', 'gfx/buttons/givetooasis_hover.png', 'gfx/buttons/givetooasis_pushed.png');
		oGiveBtn.setAction('click', _ehButtonClick, {pageid: '11076'});
	}  
	// Constructor
	_buildbuttons();
	CCOMM.session.banner = CCOMM.oasis.banner();

	// Return instantiated object	
};



CCOMM.oasis.hormenu = {};
CCOMM.temp = {};

CCOMM.oasis.hormenu.onclick = function(sType, oEvent, oPassAlong) {
	oPageData = CCOMM.oasis.pages[oPassAlong.id];
	if (oPageData.bPreview) {
		oPageData.dImg = document.createElement('img');
		oPageData.dImg.src = 'gfx/discipleship_prev.jpg';
		
	}
};

CCOMM.oasis.hormenu.aMenuData = {
	about: [
			{ text: "Missional Journey", url: "10972", submenu: { id: "missional", itemdata: [
				{ text: "Vision", url: "10973"},
				{ text: "Values", url: "10974"},
				{ text: "Our Story", url: "10975"},
				{ text: "Beliefs", url: "10976"}
				]} 
			},
			/*{ text: "Gatherings", url: "10977", submenu: { id: "gatherings", itemdata: [
				{ text: "Worship", url: "11070"}
				]} 
			},*/
			{ text: "Team", url: "10978", submenu: { id: "team", itemdata: [
				/*{ text: "Introductions", url: "11092" },*/
				{ text: "Internships", url: "10980", submenu: { id: "internships", itemdata: [
					{ text: "Journey Internship", url: "12031"},
					//{ text: "School-based Interships", url: "12034"}
					]} 
				},
				{ text: "Get Involved", url: "10992" }
				]}
			},
			{ text: "Church Planting", url: "10979"},
			{ text: "Video Intro", url: "11151" },
			{ text: "FAQ", url: "10981" }
	],
	transparent: [
		{ text: "Community", url: "10983", submenu: { id: "community", itemdata: [
			{text: "Women", url: "10984"},
			{text: "International Students", url: "10986"},
			{text: "Global Missions", url: "10987"},
			{text: "Hospitality", url: "10990"},
			{text: "Men", url: "12040"}
			]}
		},
		{ text: "Life Groups", url: "10991"},
		{ text: "Children", url: "10943", submenu: { id: "children", itemdata: [
			{text: "Outreach", url: "12041"},
			{text: "Sunday Morning Service", url: "12044"},
			{text: "Letter to the Parents", url: "12045"}
			]}
		},
		{ text: "Youth", url: "10985"},
		{ text: "Social Justice", url: "10993"},
		{ text: "Earth Care", url: "10994"}	
	],
	arts: [
		{ text: "Relevance", url: "10996" },
		{ text: "Worship and Beauty", url: "10997", submenu: { id: "worship", itemdata: [
			{ text: "Visual Arts", url:"10998" },
			{ text: "Visual Worship", url: "10999" },
			{ text: "Creative Writing", url: "11000" }
			]}
		},
		{ text: "Music on the Patio", url: "12028" },
		/*{ text: "Blogs", url: "11003" },*/
		/*{ text: "*Video" },*/
		/*{ text: "*Podcast" },*/
		/*{ text: "Random", url: "11004" }*/
	],
	interactive: [
		{text: "Passionate Spirituality", url: "11006"},
		{text: "Spiritual Discovery", url: "11007", submenu: { id: "discovery", itemdata: [
			{text: "Baptism", url: "11008"},
			{text: "Communion", url: "11009"},
			{text: "Discipleship", url: "11010"},
			{text: "Serving", url: "11011"},
			{text: "Holy Spirit", url: "11227"},
			{text: "Worship", url: "11016"}
			]}
		},
		{ text: "Talking to God", url: "11012"}
	],
	gatherings: [
		{ text: "Sunday Morning Gatherings", url: "11221", submenu: { id: "sundaymorning", itemdata: [
			{ text: "Worship", url: "11070"},
			{ text: "Prayer", url: "10988", submenu: { id: "prayer", itemdata: [
				{ text: "Pre-Service Prayer", url: "12048" },
				{ text: "Prayer Ministry", url: "12051" },
				{ text: "Prayer Training", url: "12054" },
				{ text: "Contact", url: "12057" }
				]}
			},
			{ text: "Children", url: "" },
			{ text: "Youth", url: "" }
			]}
		},
		{ text: "Life Groups", url: "10991"},
		{ text: "Unveiled", url: "11220"},
		{ text: "Worship Community Meeting", url: "11226"},
		{ text: "Recovery", url: "11224", submenu: { id: "recovery", itemdata: [
			{ text: "Recovery Meetings", url: "12060"},
			{ text: "Recovery Resources", url: "12061"},
			{ text: "Contact Us", url: "12062"}
			]}
		},
		{ text: "Church Outside the Walls", url: "11223"},
		{ text: "Monthly BBQ", url: "11222"},
	]
};


/* @ccommtodo The preview does not behave quite properly. I think mouseover and mouseout events get switched around so the preview sometimes get stuck on the screen. */
CCOMM.oasis.hormenu.controller = function() {
	/*
	 * Standard class setup:
	 * 1. Declare private variable. Prefix names with underscore.
	 * 2. Declare the object 'that' where the members are public properties and
	 *    methods of the instantiated object.
	 * 3. Declare private functions. Prefix names with underscore.
	 * 4. Do construction stuff.
	 * 5. return that
	 * 
	 * Notes: 
	 * The object 'that' can now be referenced from anywhere within the object.
	 * 
	 */
	// Class template: 
	
	// Declare private variabels
	var _aMenus = [];
	var _aMenuData = CCOMM.oasis.hormenu.aMenuData;
	var _pagePreview;
	
	
	
	
	// Declare public properties and methods
	var that = {
	};
	// Declare private functions
	
	function _headerNameToPageid(sName) {
		var sPageid;
		if (sName == 'about') {
			sPageid = '10942';
		} else if (sName == 'transparent') {
			sPageid = '10982';
		} else if (sName == 'arts') {
			sPageid = '10995';
		} else if (sName == 'interactive') {
			sPageid = '11005';
		} else if (sName == 'gatherings') {
			sPageid = '10977';
		} else {
			sPageid = '0';
		}
		return sPageid;
	}
	
	function _ehHeaderMouseover(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		var sId = dEventTarget.id;
		var aIdComponents = sId.split("_", 2);
		var sMenuName = aIdComponents[1];
		dEventTarget.src = 'gfx/menu/'+sMenuName+'_hover.gif';
		YAHOO.util.Dom.addClass(dEventTarget, 'highlight');
		_aMenus['about'].hide();
		_aMenus['transparent'].hide();
		_aMenus['arts'].hide();
		_aMenus['interactive'].hide();
		_aMenus['gatherings'].hide();
		_aMenus[sMenuName].show();
		_pagePreview.showPreview(_headerNameToPageid(sMenuName));
	}
	
	function _ehHeaderMouseout(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		var sId = dEventTarget.id;
		var aIdComponents = sId.split("_", 2);
		var sMenuName = aIdComponents[1];
		dEventTarget.src = 'gfx/menu/'+sMenuName+'.gif';
		YAHOO.util.Dom.removeClass(dEventTarget, 'highlight');
		if (e.pageY < 302) {
			_aMenus[sMenuName].hide();
		}
		_pagePreview.hidePreview(_headerNameToPageid(sMenuName));
	}
	
	function _ehHeaderClick(e, obj) {
		var dEventTarget = CCOMM.lib.getEventTarget(e);
		var sId = dEventTarget.id;
		var aIdComponents = sId.split("_", 2);
		var sMenuName = aIdComponents[1];
		CCOMM.session.pageLoader.getPage(_headerNameToPageid(sMenuName));
	}
	
	function _ehMouseOverItem(e, obj, oPassAlong) {
		_pagePreview.showPreview(oPassAlong.pageid);
	}
	
	function _ehMouseOutItem(e, obj, oPassAlong) {
		_pagePreview.hidePreview();
	}
	
	function _ehMouseClick(e, obj, oPassAlong) {
		_pagePreview.hidePreview();
		CCOMM.session.pageLoader.getPage(oPassAlong.pageid);
	}
	
	function _logOnClick(sType, aArgs) {
	}
	
	function _preloadimages() {
		var aImages =[];
		aImages[0] = new Image;
		aImages[0].src = 'gfx/menu/transparent_hover.gif';
	}
	
	function _initMenu(sMenuName) {
		_aMenus[sMenuName] = new YAHOO.widget.Menu("mnu_"+sMenuName, {visible: false, position: "dynamic", context: ["hormenu_"+sMenuName, "tl", "bl"]} );
		_aMenus[sMenuName].addItems(_aMenuData[sMenuName]);
		_aMenus[sMenuName].render('wgt_hormenu');
		_addEventHandlers(_aMenus[sMenuName]);		
		//_aMenus[sMenuName].subscribe("click", _logOnClick);
	}
	
	
 	function _addEventHandlers(oMenu) {
 		var aItems = oMenu.getItems();
 		for (var i = 0; i < aItems.length; i++) {
 			if ((typeof aItems[i].cfg.getProperty('submenu')) != 'undefined') {
 				_addEventHandlers(aItems[i].cfg.getProperty('submenu'));
 			}
 			var sUrl = aItems[i].cfg.getProperty("url");
 			aItems[i].cfg.setProperty('url', '#');
 			aItems[i].mouseOverEvent.subscribe(_ehMouseOverItem, {pageid: sUrl});
 			aItems[i].mouseOutEvent.subscribe(_ehMouseOutItem, {pageid: sUrl});
 			aItems[i].clickEvent.subscribe(_ehMouseClick, {pageid: sUrl});
 		}
 	}
 	
 	
 	
 	// Constructor
	var aMenuheaders = YAHOO.util.Dom.getElementsBy(function(){return true;}, 'img', 'wgt_hormenu');

	// Attach eventhandlers to menu headers so the menus will be showed and hidden	
	YAHOO.util.Event.addListener(aMenuheaders, 'mouseover', _ehHeaderMouseover);
	YAHOO.util.Event.addListener(aMenuheaders, 'mouseout', _ehHeaderMouseout);
	YAHOO.util.Event.addListener(aMenuheaders, 'click', _ehHeaderClick);

	_initMenu('about');
	_initMenu('transparent');
	_initMenu('arts');
	_initMenu('interactive');
	_initMenu('gatherings');
	_pagePreview = CCOMM.util.pagePreview();
};

CCOMM.calendar = {};

CCOMM.calendar.editEvent = function() {

	// Class template: 
	
	// Declare private variabels
	var _param;
	// Declare public properties and methods
	var that = {
	};
	// Declare private functions
	function _priv() {}  
	// Constructor
	_priv();
	_param = "example string";
	// Return instantiated object	
	return that;
};

CCOMM.historyManager = function() {
	// Declare private variabels
	var _param;
	// Declare public properties and methods
	var that = {
	};
	// Declare private functions
	function _priv() {}  
	// Constructor
	_priv();
	_param = "example string";
	// Return instantiated object	
	return that;
};

CCOMM.widgetLoader = {};

CCOMM.widgetLoader.classes = {
	wgt_cockpit:			CCOMM.cockpit.controller,
	wgt_email:				CCOMM.message.controller,
	wgt_flatmenu:			CCOMM.oasis.flatMenu,
	wgt_folk:				CCOMM.folk.controller,
	wgt_getinvolved:		CCOMM.oasis.getinvolved,
	wgt_givetooasis:		CCOMM.oasis.give,
	wgt_gruppe_adm: 		CCOMM.gruppeAdm,
	wgt_home:				CCOMM.oasis.homepage.controller,
	wgt_hormenu:			CCOMM.oasis.hormenu.controller,
	wgt_intros_pickperson:	CCOMM.oasis.pickPerson,
	wgt_maincontent:		CCOMM.mainContent.pageLoader,
	wgt_mainmenu: 			CCOMM.mainMenu,
	wgt_map:				CCOMM.oasis.gmap,
	wgt_minside:			CCOMM.minside.controller,
	wgt_teams:				CCOMM.oasis.Teams,
	wgt_testing:			CCOMM.util.testwgt,
	wgt_podcast:			CCOMM.oasis.Podcast,
	wgt_contact:			CCOMM.lib.contact
};

CCOMM.widgetLoader.objects = {};

CCOMM.widgetLoader.run = function() {
	var aWidgets = YAHOO.util.Dom.getElementsByClassName("widget");
	// Loop gjennom alle widgets og se om det er definert en klasse for dem i CCOMM.widgetLoader.links.
	// Hvis det er tilfelle startes init() for aktuell klasse
	for (var i = 0; i < aWidgets.length; i++) {
		if (CCOMM.widgetLoader.classes[aWidgets[i].id] != undefined) {
			CCOMM.widgetLoader.objects[aWidgets[i]] = new CCOMM.widgetLoader.classes[aWidgets[i].id]();
		}
	}
	// Initialize browser history manager
	YAHOO.util.History.initialize("yui-history-field", "yui-history-iframe");
};

CCOMM.widgetLoader.runLocal = function(sSearchRoot) {
	var aWidgets = YAHOO.util.Dom.getElementsByClassName("widget", "div", sSearchRoot);
	// Loop gjennom alle widgets og se om det er definert en klasse for dem i CCOMM.widgetLoader.links.
	// Hvis det er tilfelle startes init() for aktuell klasse
	for (var i = 0; i < aWidgets.length; i++) {
		if (CCOMM.widgetLoader.classes[aWidgets[i].id] != undefined) {
			CCOMM.widgetLoader.objects[aWidgets[i]] = new CCOMM.widgetLoader.classes[aWidgets[i].id]();
		}
	}	
};

//YAHOO.util.Event.addListener(window, "load", CCOMM.widgetLoader.run);

