/**
*	javascript.js
*	
*   This is the default javascript functions of CoreTreks Site Base for CorePublish frontends
*	
*	Please DO NOT CHANGE this file. 
*	To add your own functions, put them in another file
*	This makes sure you can update this file (javascript.js)
*	from a newer distribution without worrying about keeping your changes.
*
*	@author Arve Skj�restad
*	
*/

var timervar = null; 

function printArticle( artUrl ){
    behind = window.open(artUrl ,'printwin','height=650,width=810,status=yes,toolbar=yes,directories=no,menubar=no,location=no,resizable=no,scrollbars=yes');
}

function getContentAreaHeight() {
    if (document.all) {
        var ret  =  document.all["menuheighholder"].height;
    } else if (document.getElementById) {
		var ret =  document.getElementById("menuheighholder").height;
    }
    return  ret;
}       

function getAbsolutePos(el){
	for (var lx=0,ly=0;el!=null;
		lx+=el.offsetLeft,ly+=el.offsetTop,el=el.offsetParent);
	return {x:lx,y:ly}
}


/**
 * Sets the active stylesheet for the page.
 * 
 * 
 */
function setActiveStyleSheet(title) {
   var i, a, main;
   for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
       if(a.getAttribute("rel").indexOf("style") != -1
          && a.getAttribute("title")) {
           a.disabled = true;
           if(a.getAttribute("title") == title) {
               a.disabled = false;
           }
       }
   }
}

function getActiveStyleSheet() {
    var i, a;
    for(i=0; (a = document.getElementsByTagName("link")[i]); i++) {
        if(a.getAttribute("rel").indexOf("style") != -1
           && a.getAttribute("title")
           && !a.disabled) { 
            return a.getAttribute("title");
        }
    }
    return null;
}

var debugwin;
var debugwinopened = false;
function debug(str) {
    //return;
    // alert(str); return ;
	if (debugwinopened == false || !debugwin) {
        debugwin = window.open('about:blank','debug_window','width=1000,height=700, toolbars=no,menu=no,scrollbars=yes');
        debugwin.document.write("<h3>CorePublish Javascript Debug</h3>");
        debugwinopened = true;
    }
	debugwin.document.write( str );
	debugwin.focus();
    // make the debug win go away after a while..
    setTimeout("self.focus()",2000);
	// alert(str);
}

/**
*   Function displays the metods and properties of an javascript object
*   @param Object inarray - The array to serialize.
*/
function jsdebug(inarray, level) {
    var result = '';
    var sep = '';

    if (level > 5) {
        return;
    }

    if(inarray!=null) {
        for(var key in inarray) {
            
            if (inarray[key] == null) {
                continue;
            }

            result = "<ul>" +  typeof inarray[key];
            result += ' [' + key + '] => ';

            try {
                tmp = inarray[key].toString();
                result += tmp.substring(0,90) + "";
            } catch (e) {
                result += tmp + "";
            } 

            debug(result);
                
            if (typeof inarray[key] == "object" || typeof inarray[key] == "function") {
                jsdebug(inarray[key],level+1);
            }

            debug("</ul>");
            /*
            if(typeof inarray[key] == 'object') {
                result += '[object]';
            } else {
                result += inarray[key].toString();
            }     */



            /*if (result.length > 1000) {
                alert(result + " (continues >>) ");
                result = "";
            } */

        } 
    } else {
        result = "[null]";
    }
    // alert(result);
}

/**
 * Function that copy content from one div to another
 *
 * @param from
 * @param to
 */
function copyDivContent(from,to) {
	try {
		document.getElementById(to).innerHTML = document.getElementById(from).innerHTML;
	} catch (e) {}
}

//Function that redirect url
function urlRedirect(url) {
    if(url != "none" && url != "") {
        window.location.href = url
    }
}
function actionSelect(obj,url) {
    return url + (url.indexOf('?') > 0 ? '&' : '?') + obj.name + '=' + obj.options[obj.selectedIndex].value;
}
/**
 * Function that returns the selected value of an form
 * 
 * @return checked value or '' case no elements is checked
 */
function getSelectedRadioValue(elements) {
    var returnValue = '';
    if(!elements.value) {
        for(i=0; i<elements.length; i++) {
            if(elements[i].checked) {
                returnValue = elements[i].value;
                break;
            }
        }
    } else {
        returnValue = elements.value;
    }    
    return returnValue;
}



function startProgressBar(progressObjID,textObjID,text) {
    //Try to display progress bar
    try {
        document.getElementById(textObjID).innerHTML = text;;
        changeVisibility(progressObjID,true);
    } catch (e) {
        return false;
    }
    return true;
}

/**
 * Function that hides and shows a div
 */
function changeVisibility(objID,view) {
    //Do nothing on exception
    try {            
        if(view == false) {
            document.getElementById(objID).style.display = 'none';
        } else {
            document.getElementById(objID).style.display = 'block';
            
        }
    } catch (e) {
    }
}

/**
 * Function that close a modal dialog
 */
function closeModalDialog() {
	var md = new LyseModalDialog();
	md.hideModalDialog();
}

/**
 * Class LyseModalDialog
 *
 * @author Martni Roessland, 2007-04-03
 */
function LyseModalDialog() {
	this.viewModalDialog = viewModalDialog;
	this.hideModalDialog = hideModalDialog;
	this.viewProgressBar = viewProgressBar;
	this.hideProgressBar = hideProgressBar;		
	this.flashProgressText = flashProgressText;
	this.setHeader = setHeader;
	this.setText = setText;
	function viewModalDialog() {
		try {
			document.getElementById('modal-dialog-background').style.display = 'block';
			document.getElementById('modal-dialog-message').style.display = 'block';
			for(var i=1; i<20; i++) {
				document.getElementById('flash_spacer_'+i).style.display = 'block';
				document.getElementById('flash_container_'+i).style.display = 'none';
			}
		} catch(e) {}
	}
	function hideModalDialog() {
		try {
			document.getElementById('modal-dialog-background').style.display = 'none';
			document.getElementById('modal-dialog-message').style.display = 'none';
			for(var i=1; i<20; i++) {
				document.getElementById('flash_spacer_'+i).style.display = 'none';
				document.getElementById('flash_container_'+i).style.display = 'block';
			}
		} catch(e) {}
	}
	function viewProgressBar() {
		try {
			document.getElementById('modal-dialog-message-progress').style.display = 'block';
		} catch(e) {}
	}
	function hideProgressBar() {
		try {
			document.getElementById('modal-dialog-message-progress').style.display = 'none';
		} catch(e) {}
		
	}
	function setHeader(string) {
		try {
			document.getElementById('modal-dialog-message-header').innerHTML = string;
		} catch(e) {}
	}
	function setText(string) {
		try {
			document.getElementById('modal-dialog-message-text').innerHTML = string;
		} catch(e) {}
	}
	function flashProgressText() {
		var mdColor1 = '#ccc';
		var mdColor2 = '#000';
		var mdChosenColor;
		function doFlashProgressText() {
			try {
				if(mdChosenColor != '#ccc') { 
					document.getElementById('md-notloaded').style.color = '#ccc'; 
					mdChosenColor = '#ccc';
				} else {
					document.getElementById('md-notloaded').style.color = '#000'; 
					mdChosenColor = '#000';
				}				
			} catch (e) {}
			setTimeout(doFlashProgressText,500);
		}
		doFlashProgressText();
	}
}
 


/**
 * Class ElementUtil
 * 
 * @author Martin Roessland, 2006-11-06
 */
function ElementUtil() {
    //Adding object function
    this.setElementVisible = setElementVisible;
    this.moveElementBasedOnPosElement = moveElementBasedOnPosElement;
    this.changeElementStyleValue = changeElementStyleValue;

    /**
     * Function that sets an element visible
     * 
     * @param boolean bool //true equals display
     */
    function setElementVisible(objectID,bool) {
        try {
            document.getElementById(objectID).style.visibility = (bool?'visible':'hidden');
        } catch (e) {}
    }
    /**
     * Function that moves an element based on another element
     * 
     * @param objectID //object to move
     * @param posObjectID //object to use for positioning
     * @param posTopExtra //Additional top
     * @param posLeftExtra //Additional left
     */
    function moveElementBasedOnPosElement(objectID,posObjectID,posTopExtra,posLeftExtra) {
        try {
            pos = getAbsolutePos(document.getElementById(posObjectID));
            document.getElementById(objectID).style.top = (pos.y + posTopExtra)+'px';
            document.getElementById(objectID).style.left = (pos.x + posLeftExtra)+'px';
        } catch (e) {}
        //Function that returns absolut position of the given element
        function getAbsolutePos(el){
                for (var lx=0,ly=0;el!=null;
                        lx+=el.offsetLeft,ly+=el.offsetTop,el=el.offsetParent);
                return {x:lx,y:ly}
        }
    }
    /**
     * Function that changes a css value of an element
     * 
     * @param objectID //id of object to slide
     * @param styleAttribute //style attribute to change (pixel change)
     * @param delay //millisecond between every value change
     * @param valueFrom //negative and positive integer
     * @param valueTo //negative and positive integer
     * @param valueMiddle //middle value in case we are zooming out in back again. If you do not want to use this, set it to boolean false
     * @param valueChangeGap //negative and positive integer of how much the value are going to change at time
     * @param valueStaticStart //static value that comes before the generated value (ex: alpha(opacity=, <blanc>)
     * @param valueStaticEnd //static value that comes after the generated value (ex: px, %, <blanc>)
     */
    function changeElementStyleValue(objectID,styleAttribute,startDelay,loopDelay,valueFrom,valueTo,valueMiddle,valueChangeGap,valueStaticStart,valueStaticEnd) {
        var _ce_objID = objectID;
        var _ce_sa = styleAttribute;
        var _ce_sd = startDelay;
        var _ce_ld = loopDelay;
        var _ce_vf = valueFrom;
        var _ce_vt = valueTo;
        var _ce_vt_tmp = valueTo;
        var _ce_vm = valueMiddle;
        var _ce_vcg = valueChangeGap;
        var _ce_vss = valueStaticStart;
        var _ce_vse = valueStaticEnd;
        /**
         * Recursive function that do the value change
         * 
         * @return Boolean true on successfull change or false if an exception appears
         */
        function doChangeElementStyleValue() {
        	try {
                /**
                 * In case middle value is not false we first have
                 * to walk to the middle value and then futher to
                 * the "to"-value.
                 */
                if(_ce_vm !== false) {
                    _ce_vt = _ce_vm;
                }
                /**
                 * In case we are going to handle the opacity
                 * attribute we have to do special handling to support both
                 * firefox and ie
                 */
                if(_ce_sa == 'opacity') {
                    //microsoft browsers
                    if(navigator.appName.indexOf("Microsoft")!=-1) {
                        document.getElementById(_ce_objID).filters.alpha.opacity=((Math.round((_ce_vf*10)))/10);
                    //the other browsers
                    } else {
                        document.getElementById(_ce_objID).style.opacity=((Math.round(((_ce_vf/100)*10)))/10);
                        document.getElementById(_ce_objID).style.MozOpacity=((Math.round(((_ce_vf/100)*10)))/10);
                    }
                //else handle it normaly
                } else {
                    document.getElementById(_ce_objID).style[_ce_sa] = _ce_vss+((Math.round((_ce_vf*10)))/10)+_ce_vse;
                }
                //If "from" value is less than "to" value
                if(_ce_vf < _ce_vt) {
                    _ce_vf = _ce_vf + _ce_vcg > _ce_vt ? _ce_vt : _ce_vf + _ce_vcg;
                //If "from" value is greater than "to" value
                } else if(_ce_vf > _ce_vt) {
                    _ce_vf = _ce_vf - _ce_vcg < _ce_vt ? _ce_vt : _ce_vf - _ce_vcg;
                //If middle value is set and reached we set the final to value
                } else if(_ce_vm !== false) {
                    _ce_vm = false;
                    _ce_vt = _ce_vt_tmp;
                //Else we jump out of this endless recursion
                } else {
                    return true;
                }
                //In case we have come so far, we run this function over again
                setTimeout(doChangeElementStyleValue,_ce_ld);
            } catch (e) {
                alert(e);
                return false;
            }
            return false;
        }
        //Run the recursive function
        setTimeout(doChangeElementStyleValue,_ce_sd);
		
    }
}        

/****** These functions is to make the login boxes to set and remove the login-info. ***********/


/**
 * @param el The input element.
 * @param default_text The default text
*/
function clearIfDefaultText(el, default_text){
        if(el.value == default_text){
                el.value = '';
        }
}


/**
 * @param el The input element.
 * @param default_text The default text
*/
function setDefaultIfEmpty(el, default_text) {
        if(el.value == '') {
                el.value = default_text;
        }
}



/**
 * This function takes four parameters:
 * 
 * Possible actions are:
 * <ul>
 * 	<li><b>swap: </b>replaces class c1 with class c2 in object o.</li>
 * 	<li><b>add: </b>adds class c1 to the object o.</li>
 * 	<li><b>remove: </b>removes class c1 from the object o.</li>
 * 	<li><b>check: </b> test if class c1 is already applied to object o and returns true or false.</li>
 * </ul>
 * 
 * 
 * @param String a defines the action you want the function to perform.
 * @param Element o The object in question.
 * @param String c1 The name of the first class
 * @param String c2 The name of the second class
*/
function lyseChangeCssClass(a,o,c1,c2) {
	
  switch (a){
    case 'swap':
    	if( o.className != lyseChangeCssClass('check',o,c1) ) {
    		o.className.replace(c2,c1);
    	}
    	else {
    		o.className.replace(c1,c2);
    	}
      return true;
    break;
    case 'add':
      if(!lyseChangeCssClass('check',o,c1)){
      		o.className+=o.className?' '+c1:c1;
            return true;
      }
      else {
      	return false;
      }
    case 'remove':
      var rep=o.className.match(' '+c1)?' '+c1:c1;
      o.className=o.className.replace(rep,'');
      return true;
    break;
    case 'check':
      return new RegExp('\\b'+c1+'\\b').test(o.className)
    break;
  }
  return false;
}

var lyseArticleMobileActiveArticle = '';

/**
 * Sets the article with articleId == i and the menu-item for articleId == i to have css class active.
 * 
 * Also remove the current active article.
 *
 * Spesific for Article Mobile.
*/
function lyseArticleMobileSetActive(i) {
	
	if(i == lyseArticleMobileActiveArticle) {
		return;
	}
	art_id_base = 'tile-article-mobile-page_';
	li_id_base = 'tile-article-mobile-page_selector_';
	
	// get the element for the article
	art_activate = document.getElementById(art_id_base + i);
	art_deactivate = document.getElementById(art_id_base + lyseArticleMobileActiveArticle);
	// get the element for the article to hide
	
	// get the menu-item to activate
	// get the menu-item do de-activate.
	li_activate = document.getElementById(li_id_base + i);
	li_deactivate = document.getElementById(li_id_base + lyseArticleMobileActiveArticle);
	
	//set active
	lyseChangeCssClass('add', art_activate, 'active');
	lyseChangeCssClass('add', li_activate, 'active');
	lyseChangeCssClass('remove', art_deactivate, 'active');
	lyseChangeCssClass('remove', li_deactivate, 'active');
	
	// Set new lyseArticleMobileActiveArticle
	lyseArticleMobileActiveArticle = i;
}

var lyseArticleMobileActiveImage = 0;

function lyseArticleMobileSetImage(i) {
	if( lyseArticleMobileActiveImage == i ){
		return false;
	}
	img_activate = document.getElementById('tile-article-mobile-img_' + i);
	img_deactivate = document.getElementById('tile-article-mobile-img_' + lyseArticleMobileActiveImage);
	
	lyseChangeCssClass('add', img_activate, 'active');
	lyseChangeCssClass('remove', img_deactivate, 'active');
	
	lyseArticleMobileActiveImage = i;
	return false;
}

function lyseSwitchDisplayBlockNone(el_id) {
	var el = document.getElementById(el_id);
	//alert(el.style.display);
	if(lyseChangeCssClass('check', el, 'active') ){
		lyseChangeCssClass('remove', el, 'active');
	}
	else {
		lyseChangeCssClass('add', el, 'active');
	}
	
	return false;
}


function lyseScSrUpdateSubArea(){
	// area object
	area_obj = document.getElementById('tile-sc-sr-editRequest-area');
	subarea_obj = document.getElementById('tile-sc-sr-editRequest-subarea');
	// If the subarea-list does not exist, then return false.
	if(subarea_obj == null) {
		return false;
	}
	// Remove all the 
	while(subarea_obj.length > 0) {
		subarea_obj.remove(subarea_obj.options[0]);
	}
	
	o = document.createElement('option');
	o.value='';
	if(area_obj.value == "") {
		o.text = ' -Velg område først-';
	}
	else {
		o.text = ' -Velg kategori- ';
	}
	try {
		subarea_obj.add(o, null);
	}
	catch( e){
		subarea_obj.add(o);
	}
    if(typeof tile_sc_sr_area[area_obj.value] !== "undefined"){
        var subareas = tile_sc_sr_area[area_obj.value];
        for (var area in subareas){
            if (typeof area == "undefined"){
                continue;
            }
            o = document.createElement('option');
            o.value = area;
            o.text = subareas[area];
            try {
                subarea_obj.add(o, null);
            }
            catch (e) {
                subarea_obj.add(o);
            }
        }
	}
	//alert(new_html);
	//subarea_obj.innerHTML = new_html;
	//subarea_obj.value = tile_sc_sr_subarea_default;
	return true;
}

/*********        HERE IS SOME FUNCTIONS FOR THE CONFIG-EDITOR*******/

function lyseTileConfigToggleVisibleChildren(el) {
	var ul = el.parentNode.childNodes;
	
	for(i =0 ; i < ul.length ; i++) {
		
		if(ul[i].nodeName == 'UL' || ul[i].nodeName == 'TABLE') {
			
			if(ul[i].style.display == 'block') {
				ul[i].style.display='none';
			}
			else {
				ul[i].style.display='block';
			}
		}
	}
}


function lyseTileConfigGetHiddenIds2() {
	
	/**
	 *	Finds all the nodes that is visible. 
	*/
	this.getVisibleNodes = function getVisibleNodes() {
		var root_el = document.getElementById('lyse-sc-config-node-1');
		root_el = root_el.parentNode;
		var active_nodes = new Array();
		// FOR ALL the span-elements
		   	// FIND the ul-element
		   		// IF ul-elementet is display!= none
		   			// IF ul has css-class 'node'
		   				// Add to active_nodes
		var span_elements = root_el.getElementsByTagName('SPAN');
		for(i=0 ; i < span_elements.length ; i++) {
			var children = span_elements[i].parentNode.childNodes;
			for(j=0 ; j < children.length ; j++){
				if( children[j].nodeName == 'UL' ){
					if(children[j].style.display != 'none') {
						if(lyseChangeCssClass('check', children[j], 'node')) {
							var id = span_elements[i].id.match("[0-9]+");
							active_nodes[id] = id;
						}
					}
				}
			}
		}
		return active_nodes;
	}
	
	/**
	 * Sets which nodes to display.
	*/
	this.setDisplay = function setDisplay() {
		var cookie = getCookie('lyse_sc_config_node_display');
		
		if(cookie != null && cookie.length > 0) {
			var nodes = cleanStringArray( cookie );
			setNodeDisplayFromCookie(nodes);
		}
		else {
			setDisplayWithoutCookie();
		}
	}
	
	function cleanStringArray(str) {
		var parts = str.split(',');
		var new_array = new Array();
		for(i = 0 ; i < parts.length ; i++) {
			if(parts[i].length > 0) {
				var id = parseInt(parts[i]);
				new_array[id] = id;
			}
		}
		return new_array;
	}
	
	
	function setNodeDisplayFromCookie(nodes) {
		var root_el = document.getElementById('lyse-sc-config-node-1');
		root_el = root_el.parentNode;
		
		var ul_elements = root_el.getElementsByTagName('UL');
		for(i = 0 ; i < ul_elements.length ; i++) {
			var siblings = ul_elements[i].parentNode.childNodes;
			for(j = 0 ; j < siblings.length ; j++) {
				if(siblings[j].nodeName == 'SPAN') {
					id = siblings[j].id.match('[0-9]+');
					if(nodes[id] != null) {
						ul_elements[i].style.display = 'block';
					}
					else {
						ul_elements[i].style.display = 'none';
					}
				}
			}
		}
	}
	
	/**
	 * Sets the visibility state
	*/
	function setDisplayWithoutCookie() {
		var root_el = document.getElementById('lyse-sc-config-node-1');
		root_el = root_el.parentNode;
		
		var ul_elements = root_el.getElementsByTagName('UL');
		for(var i = 0 ; i < ul_elements.length ; i++) {
			
			var siblings = ul_elements[i].parentNode.childNodes;
			for(var j = 0 ; j < siblings.length ; j++) {
				if(siblings[j].nodeName == 'SPAN'){
					var id = siblings[j].id.match('[0-9]+');
					if(id == 1) {
						ul_elements[i].style.display = 'block';
					}
					else {
						ul_elements[i].style.display = 'none';
					}
				}
			}
			
		}
	}
}

function lyseTileConfigGetHiddenIds() {
	var f = new lyseTileConfigGetHiddenIds2();	
	var node_display_ids = f.getVisibleNodes();
	setCookie('lyse_sc_config_node_display', node_display_ids);
	
}


function lyseTileConfigAddProperty(){
	el = document.getElementById('properties_table');
	r_nr = el.rows.length;
	r = el.insertRow(r_nr);
	r.innerHTML = "<td><a href=\"javascript:lyseTileConfig_DeleteProperty('properties_table', "+r_nr+")\">Del</a></td>" 
					+ "<td><input type=\"text\" name=\"add_properties[]\" /></td>\n"
					+ "<td><select name=\"add_properties_type[]\">\n"
						+ "\t<option value=\"STRING\" selected>STRING</option>\n"
						+ "\t<option value=\"INTEGER\" >INTEGER</option>\n"
						+ "\t<option value=\"FLOAT\" >FLOAT</option>\n"
						+ "\t<option value=\"OBJECT\" >OBJECT</option>\n"
					+ "</select></td>\n"
					+ "<td></td>"
					+ "<td><input type=\"checkbox\" name=\"add_properties_keyword[]\" value=\"1\" /></td>";
}
        
function lyseTileConfig_DeleteProperty(table_id, r_nr) {
	table = document.getElementById(table_id);
	table.deleteRow(r_nr);
}




/********** End of functions for config-editor ***********/



/********** Cookie functions *****************************/


/*
   name - name of the cookie
   value - value of the cookie
   [expires] - expiration date of the cookie
     (defaults to end of current session)
   [path] - path for which the cookie is valid
     (defaults to path of calling document)
   [domain] - domain for which the cookie is valid
     (defaults to domain of calling document)
   [secure] - Boolean value indicating if the cookie transmission requires
     a secure transmission
   * an argument defaults when it is assigned null as a placeholder
   * a null placeholder is not required for trailing omitted arguments
*/

function setCookie(name, value, expires, path, domain, secure) {
	var curCookie = name + "=" + escape(value) +
		((expires) ? "; expires=" + expires.toGMTString() : "") +
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		((secure) ? "; secure" : "");
	document.cookie = curCookie;
}


/*
  name - name of the desired cookie
  return string containing value of specified cookie or null
  if cookie does not exist
*/

function getCookie(name) {
	var dc = document.cookie;
	var prefix = name + "=";
	var begin = dc.indexOf("; " + prefix);
	if (begin == -1) {
		begin = dc.indexOf(prefix);
		if (begin != 0) return null;
	} else
		begin += 2;
	var end = document.cookie.indexOf(";", begin);
	if (end == -1)
	end = dc.length;
	return unescape(dc.substring(begin + prefix.length, end));
}

/*
   name - name of the cookie
   [path] - path of the cookie (must be same as path used to create cookie)
   [domain] - domain of the cookie (must be same as domain used to
     create cookie)
   path and domain default if assigned null or omitted if no explicit
     argument proceeds
*/

function deleteCookie(name, path, domain) {
	if (getCookie(name)) {
		document.cookie = name + "=" +
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		"; expires=Thu, 01-Jan-70 00:00:01 GMT";

	}
}

/********** END Cookie functions **************************/

function lyseLoginIfErrorPrint(el) {
	var cookie = false;
	try {
		cookie = getCookie('login.error');
	}
	catch(e) {
		
	}
	if(cookie) {
		
		el.innerHTML = cookie.replace(/\+/g, ' ');
		deleteCookie('login.error');
	}
}


/**************** Fuctions for Courses - Selfcare **************/
var lyse_sc_cources_add_person_nb = 0;

/**
 * This function adds a person-form to the list of new persons.
 *
 *
*/
function lyseScCoursesAddPerson() {
	el = document.getElementById('lyse_sc2_course_attendees');
	
		
	table = document.createElement('table');
	
	var id = "lyse_sc2_course_attendee[" + lyse_sc_cources_add_person_nb + "]";
	table.setAttribute('id', id);
	table.setAttribute('class', 'attendees');
	
	inner = "\n\t\t\t<tr>";
	inner += "\n\t\t\t\t<td>Navn:</td>";
	inner += "\n\t\t\t\t<td><input type=\"text\" name=\"name[" + lyse_sc_cources_add_person_nb + "]\" /></td>";
	inner += "\n\t\t\t\t<td></td>";
	inner += "\n\t\t\t</tr>";
	inner += "\n\t\t\t<tr>";
	inner += "\n\t\t\t\t<td>E-post:</td>";
	inner += "\n\t\t\t\t<td><input type=\"text\" name=\"email[" + lyse_sc_cources_add_person_nb + "]\" /></td>";
	inner += "\n\t\t\t\t<td></td>";
	inner += "\n\t\t\t</tr>";
	inner += "\n\t\t\t<tr>";
	inner += "\n\t\t\t\t<td>Adresse:</td>";
	inner += "\n\t\t\t\t<td><input type=\"text\" name=\"address[" + lyse_sc_cources_add_person_nb + "]\" /></td>";
	inner += "\n\t\t\t\t<td></td>";
	inner += "\n\t\t\t</tr>";
	inner += "\n\t\t\t<tr>";
	inner += "\n\t\t\t\t<td>Postnr og sted:</td>";
	inner += "\n\t\t\t\t<td><input type=\"text\" name=\"postal_code[" + lyse_sc_cources_add_person_nb + "]\" class=\"postal_code\" /><input type=\"text\" name=\"post_office[" + lyse_sc_cources_add_person_nb + "]\" class=\"post_office\" /></td>";
	inner += "\n\t\t\t\t<td></td>";
	inner += "\n\t\t\t</tr>";
	inner += "\n\t\t\t<tr>";
	inner += "\n\t\t\t\t<td>Stilling:</td>";
	inner += "\n\t\t\t\t<td><input type=\"text\" name=\"position[" + lyse_sc_cources_add_person_nb + "]\" /></td>";
	inner += "\n\t\t\t\t<td></td>";
	inner += "\n\t\t\t</tr>";
	inner += "\n\t\t\t<tr>";
	inner += "\n\t\t\t\t<td>Overnatting:</td>";
	inner += "\n\t\t\t\t<td><input type=\"checkbox\" name=\"lodging[" + lyse_sc_cources_add_person_nb + "]\" /></td>";
	inner += "\n\t\t\t\t<td><button type=\"button\" onclick=\"javascript:lyseScCoursesDeletePerson(this);\">Slett</button></td>";
	inner += "\n\t\t\t</tr>";
	table.innerHTML = inner;
	el.appendChild(table);
	lyse_sc_cources_add_person_nb++;
}

/**
 * Deletes a person which has been added to the form.
*/
function lyseScCoursesDeletePerson(button) {
	var table = button.parentNode.parentNode.parentNode
	var attendees = table.parentNode;
	attendees.removeChild(table);
}

/** ====== DLS Profile functions ===== */

function profile_deleteContact (blockNum) {

    var div = document.getElementById('profile_div_' + blockNum);
	if(div != null){
		div.style.display = 'block';
	}


    var div = document.getElementById('profile_div_delete_' + blockNum);
	if(div != null){
		div.style.display = 'block';
	}

    var div2 = document.getElementById('profile_div_edit_' + blockNum);
	if(div2 != null){
		div2.style.display = 'none';
	}
    var div3 = document.getElementById('profile_div_display_' + blockNum);
	if(div3 != null){
		div3.style.display = 'none';
	}
	
	
	
}


function profile_toggleContact(blockId) {
    var div = document.getElementById(blockId);
	if(div != null){
		div.style.display = (div.style.display == 'none'?'block':'none');
	}
}

function profile_editContact(blockNum) {
    
    var div = document.getElementById('profile_div_' + blockNum);
	if(div != null){
		div.style.display = 'block';
	}
	
	var div2 = document.getElementById('profile_div_edit_' + blockNum);
	var div3 = document.getElementById('profile_div_display_' + blockNum);
	
	
	var div4 = document.getElementById('profile_div_delete_' + blockNum);
	
	if(div4 != null){
		if (div4.style.display == 'block') {
			if(div2 != null){ 
				div2.style.display = 'block';
			}
			if(div3 != null){ 
				div3.style.display = 'none';
			}

			div4.style.display = 'none';
			
		return;
		}
	}
	
    
	if(div2 != null){
		div2.style.display = (div2.style.display == 'none'?'block':'none');
	}
    
	if(div3 != null){
		div3.style.display = (div3.style.display == 'none'?'block':'none');
	}
}

function profile_editAddress() {
    var div = document.getElementById('address_div');
	if(div != null){
		div.style.display = 'block';
	}
    var div2 = document.getElementById('address_div_edit');
	if(div2 != null){
		div2.style.display = (div2.style.display == 'none'?'block':'none');
	}
    var div3 = document.getElementById('address_div_display');
	if(div3 != null){
		div3.style.display = (div3.style.display == 'none'?'block':'none');
	}
}

function profile_fillInContent(formField,myContent) {
	var myform = document.getElementById(formField);
	myform.value = myContent;
}

function profile_changeColor(formField) {
	var myform = document.getElementById(formField);
	myform.style.color = "#ff0000";
}

function profile_setChecked(formField) {
	var myform = document.getElementById(formField);
	myform.checked = true;
}
/** ====== End DLS Profile functions ===== */


/** ====== Begin DLS Alias functions ===== */
/** @author Reidar Agas�ster  			   */


/**
 * Method to check if input passwords match.
 * 
 * @param string password   Input password
 * @param string passwordRepeat Input password Repeat
 * @return boolean true on success
 */
function aliasCheckPasswordMatch (password,passwordRepeat) {
	if (password == passwordRepeat) { return true;}
	else {return false; }
	
}

/**
 * Method that submits the form with action to create an alias with password 
 * 
 *  @param string aliasFormName  The name of the form (dynamical generated) 
 *  @param string messageElement   The element id of the div that should get error message.
 * 
 *  @return none.  Puts error sting in message element in webpage.
 */
function createAliasSubmit(aliasFormName,messageElement) {
//	var aliasUsername = document.forms['form.alias.action'].alias_username.value;
	errorStringGeneral = '<b>Alle feltene mangler!.</b>';

	try {
		var aliasUsername = document.forms[aliasFormName].alias_username.value
		var aliasPassword = document.forms[aliasFormName].alias_password.value
		var aliasPasswordRepeat = document.forms[aliasFormName].alias_password_repeat.value

		}

		catch (e) {
			try {document.getElementById(messageElement).innerHTML = errorStringGeneral;}
			catch (e) {return;}
			return;
		}


	var errorStringPassword = '<b>Passordene var ikke like!<b>';
	var errorStringMissingPassword = '<b>Passord mangler!<b>';
	var errorStringMissingUsername = '<b>Brukernavn mangler!<b>';
	

	if (aliasPassword.length < 1) {
		
		try {document.getElementById(messageElement).innerHTML = errorStringMissingPassword;}
		catch (e) {return;}
		return;
	}


	if ( aliasCheckPasswordMatch(aliasPassword,aliasPasswordRepeat) != false ) {

		if (aliasUsername.length > 1) {
		try {document.getElementById(messageElement).innerHTML = '';}
		catch (e) {}
			document.forms[aliasFormName].alias_action.value = 'create';

		// Trix to solve static mapping in xmlhttprequest service mapper.
		var temp_form_name = document.forms[aliasFormName].name;
		document.getElementById(aliasFormName).setAttribute("name",'form.alias.action');
		document.getElementById(aliasFormName).submit();
		document.getElementById(aliasFormName).setAttribute("name",temp_form_name);
		
		
		}
		else {
		try {document.getElementById(messageElement).innerHTML = errorStringMissingUsername;}
		catch (e) {return;}
		return;
		
		}

	}
	else {
		// The passwords didnt match.
		try {document.getElementById(messageElement).innerHTML = errorStringPassword;}
		catch (e) {return;}
		return;
	}




}

/**
 * Method that submits the form with action to rename an alias name.
 * 
 *  @param string aliasFormName  The name of the form (dynamical generated)-  
 *  @param string messageElement   The element id of the div that should get error message.
 * 
 *  @return none.  Puts error sting in message element in webpage.
 */
function renameAliasUsernameSubmit(aliasFormName,messageElement) {

	var aliasUsername = document.forms[aliasFormName].alias_username.value;

		
	try {document.getElementById(messageElement).innerHTML = '';}
	catch (e) {}

	document.forms[aliasFormName].alias_action.value = 'renamealias';


	// Trix to solve static mapping in xmlhttprequest service mapper.
	var temp_form_name = document.forms[aliasFormName].name;
	document.getElementById(aliasFormName).setAttribute("name",'form.alias.action');
	document.getElementById(aliasFormName).submit();
	document.getElementById(aliasFormName).setAttribute("name",temp_form_name);



}

/**
 * Method that is validating input and submits the form. 
 * 
 * @param string aliasFormName  The name of the form (dynamical generated)-  
 * @param string messageElement   The element id of the div that should get error message.
 * 
 * @return none.  Puts error sting in message element in webpage.
 */
function changeAliasPasswordSubmit(aliasFormName,messageElement) {

	var aliasPassword = document.forms[aliasFormName].alias_password.value;
	var aliasPasswordRepeat = document.forms[aliasFormName].alias_password_repeat.value;
	var errorStringPassword = '<b>Passordene var ikke like!<b>';
	
	if ( aliasCheckPasswordMatch(aliasPassword,aliasPasswordRepeat) != false ) {
		
		try {document.getElementById(messageElement).innerHTML = '';}
		catch (e) {}

		document.forms[aliasFormName].alias_action.value = 'changepassword';

		// Trix to solve static mapping in xmlhttprequest service mapper.
		var temp_form_name = document.forms[aliasFormName].name;
		document.getElementById(aliasFormName).setAttribute("name",'form.alias.action');
		document.getElementById(aliasFormName).submit();
		document.getElementById(aliasFormName).setAttribute("name",temp_form_name);

//		var temp_form_name = document.forms[aliasFormName].name;
//		document.forms[aliasFormName].name = 'form.alias.action';
//		document.forms['form.alias.action'].submit();
//		document.forms['form.alias.action'].name = temp_form_name;
	}
	else {
		// The passwords didnt match. 
		try {document.getElementById(messageElement).innerHTML = errorStringPassword;}
		catch (e) {}
	}
}

function checkDate (dateString,messageElement) { 
	//TODO: Riktig format til submit YYYY-MM-DD
    //TODO: input format DD.MM.YYYY
    
    	
	
}

/**
 * Method that does some checking on input fields and submit the form to do a alias username request to a user via email or sms
 * 
 * @param string communicationtype     'email' or 'sms'
 * 
 * @return returns and prints error message with alert on error, or returns error/success message from Alias Methods.  
 */
function aliasUsernameSubmit(communicationtype) {
	
document.forms['forgotton-aliasusername'].alias_communicationtype.value = communicationtype;

// Setting variables that is div id elements to report errors to.
var messageElement1= 'forgotton-username-error-1';
var messageElement2= 'forgotton-username-error-2';
var messageElement3= 'forgotton-username-error-3';
var messageElement4= 'forgotton-username-error-4';

var errorMessageMissingFields = '<b>Feltet \'Mobil eller e-post\' m&aring; v&aelig;re utfylt!</b>';
var errorMessageMissingCustomerId =  '<b>P&aring;krevd felt \'kundenummer\' er tomt!</b>';
var errorMessageMissingBirthDate =  '<b>P&aring;krevd felt \'f&oslash;dselsdato\' er tomt!</b>';

try {
	
var input_customerid = document.getElementById('input_customerid').value;
//var input_cellular = document.getElementById('input_cellular').value;
var input_communicationid = document.getElementById('input_communicationid').value;
var input_dateofbirth = document.getElementById('input_dateofbirth').value;
//var input_email = document.getElementById('input_email').value;


if ( (input_customerid.length < 1) ) { 
	try { 
		document.getElementById(messageElement1).innerHTML = errorMessageMissingCustomerId ;
		}
	catch (e) {}

	return; }
if ( (input_dateofbirth.length < 1) ) { 
	try { 
		document.getElementById(messageElement1).innerHTML = errorMessageMissingBirthDate ;
		}
	catch (e) {}
	
	return; }


if (input_communicationid.length == 0)   { 
	try { 
		document.getElementById(messageElement1).innerHTML = errorMessageMissingFields ;
		}
	catch (e) {
		
	}
	return; 
	}




document.forms['forgotton-aliasusername'].submit();

}


catch (e) {}


}



function checkCommunicationIdInputField (numberString,messageElement,errorStringCharacters) {
	// Legal characters 
	reCharacters = /^[a-zA-Z0-9\@\.\-\+]+$/;
	//reCharacters = /^[a-zA-Z0-9\@\.\-]+$/;
	
	
	// Length match

	if (  numberString.length == 0 ) {
			try { document.getElementById(messageElement).innerHTML = '';  }
			catch (e) { }
			return;
			
	}
	
	try {

			// Match. 
			if (  numberString.match(reCharacters).length < 1  ) {
				
					// We got characters thatis not in re
					try {document.getElementById(messageElement).innerHTML = errorStringCharacters;}
					catch (e) {}
					return;
			}

			else {
				
					// All good.
					try {document.getElementById(messageElement).innerHTML = '';}
					catch (e) {}
	
				}

		}
		// No match. catch it
		catch (e) {
					try { document.getElementById(messageElement).innerHTML = errorStringCharacters; }
					catch (e) { }
					return;	
		}


		try {document.getElementById(messageElement).innerHTML = '';}
		catch (e) {}
	
	
	
	
}




/**
 * Method checks the number input field if it only contains numbers.
 * 
 * @param string numberString Contains the value of the input field
 * @param string messageElement The id of the message elemement in DOM html.
 * @param string errorStringCharacters Contains the error message to display.
 *
 * @return none.  Puts error sting in message element in webpage. 
 */
function checkNumberInputField (numberString,messageElement,errorStringCharacters) {
	// Legal characters 
	reCharacters = /^[0-9]+$/;
	// Length match

	if (  numberString.length == 0 ) {
			try { document.getElementById(messageElement).innerHTML = '';  }
			catch (e) { }
			return;
			
	}
	
	try {

			// Match. 
			if (  numberString.match(reCharacters).length < 1  ) {
				
					try {document.getElementById(messageElement).innerHTML = errorStringCharacters;}
					catch (e) {}
					return;
			}

			else {
				
				
					try {document.getElementById(messageElement).innerHTML = '';}
					catch (e) {}
	
				}

		}
		// No match. catch it
		catch (e) {
					try { document.getElementById(messageElement).innerHTML = errorStringCharacters; }
					catch (e) { }
					return;	
		}


		try {document.getElementById(messageElement).innerHTML = '';}
		catch (e) {}
	
	
	
	
}

/**
 * Method checks the date input field for valid structure.
 * 
 * @param string numberString Contains the value of the input field
 * @param string messageElement the id of the message elemement in DOM html.
 * @param string errorStringCharacters contains the error message to display.
 *
 * @return none.  Puts error sting in message element in webpage. 
 */

function checkDateInputField (dateString,messageElement,errorStringCharacters) {
	

	
	// Legal structure 
	reStructure = /^[\d]{1,2}\.[\d]{1,2}\.[\d]{4,4}$/;
	// Lengt match
	if (  dateString.length == 0 ) {
			try { document.getElementById(messageElement).innerHTML = '';  }
			catch (e) { }
			return;
			
	}
	
	try {

			// Match. 
			if (  dateString.match(reStructure).length < 1  ) {
				
					try {document.getElementById(messageElement).innerHTML = errorStringCharacters;}
					catch (e) {}
					return;
			}

			else {
				
				
					try {document.getElementById(messageElement).innerHTML = '';}
					catch (e) {}
	
				}

		}
		// No match. catch it
		catch (e) {
					try { document.getElementById(messageElement).innerHTML = errorStringCharacters; }
					catch (e) { }
					return;	
		}


		try {document.getElementById(messageElement).innerHTML = '';}
		catch (e) {}
	
	
	
	
}



/**
 * Checks that the rules of alias name is contained.
 * 
 * @param string alias username
 * @param string messageElement  name of div element id to get message to user. 
 * @author Reidar Agas�ster
 */
function aliasCheckStrengthAlias (alias,messageElement) {
	// Legal characters 
	reCharacters = /^[A-Za-z0-9\@\-\._]+$/;
	var reOnlyNumbers = /^[0-9]*$/;
	errorStringCharacters = '<b>Ikke gyldige tegn i brukernavn.<b>';
	errorStringLength = '<b>Det m&aring; v&aelig;re minst 5 tegn i brukernavnet.<b>';
	var errorStringDigits ='<strong>Brukernavnet kan ikke bare inneholde tall.<strong>';
	
	//Characters match
	// Length match
	if (  alias.length == 0 ) {
			try { document.getElementById(messageElement).innerHTML = '';  }
			catch (e) { }
			return;
	}
	
	if ( (( alias.length > 0) && (alias.length < 5) ) ) {
			try { document.getElementById(messageElement).innerHTML = errorStringLength;  }
			catch (e) { }
			return;


	}

	else {



		try {
			// Match. 
			if (  alias.match(reCharacters).length < 1  ) {
					
					try {document.getElementById(messageElement).innerHTML = errorStringCharacters;}
					catch (e) {}
					return;
			}

			else {
					try {document.getElementById(messageElement).innerHTML = '';}
					catch (e) {}
	
			}
			
			if (alias.match(reOnlyNumbers)) {
                try {
                    document.getElementById(messageElement).innerHTML = errorStringDigits;
                }
                catch (e) {}
                return;
            }

		}
		// No match. catch it
		catch (e) {
		
					try { document.getElementById(messageElement).innerHTML = errorStringCharacters; }
					catch (e) { }
					return;	
		}


		try {document.getElementById(messageElement).innerHTML = '';}
		catch (e) {}
	
	}
	
	
	}

/**
 * Method that checks the password rules. At least 2 numbers and 3 letters and at least 8 characters.
 * 
 * @param string password Contains the value of the input field
 * @param string messageElement the id of the message elemement in DOM html.
 *  
 * @return none.  Puts error sting in message element in webpage. 
 * 
 */
function aliasCheckStrengthPassword (password,messageElement) {
	/* Not in use, commented out because it is maybe too strong for the users
	reNumbers = /(\d)/gi;
	reCharacters = /([A-Za-z])/gi;
    */
	errorStringNumbers = '<b>Det m&aring; v&aelig;re minst 2 tall i passordet.<b>';
	errorStringCharacters = '<b>Det m&aring; v&aelig;re minst 3 bokstaver i passordet.<b>';
	errorStringLength = '<b>Det m&aring; v&aelig;re minst 6 tegn i passordet.<b>';
	/*
	//Characters match
	try {
		// Match. but not enough characters
		if ( (password.match(reCharacters).length) < 3  ) {
				try {document.getElementById(messageElement).innerHTML = errorStringCharacters;}
				catch (e) {}
				return;
		}
	}
	// No match. catch it
	catch (e) {
		
				try { document.getElementById(messageElement).innerHTML = errorStringCharacters; }
				catch (e) { }
				return;	
	}
	


	//Number match
	try {
		// Match. but not enough numbers
		if ( (password.match(reNumbers).length) < 2  ) {
				try {document.getElementById(messageElement).innerHTML = errorStringNumbers;}
				catch (e) {}
				return;
		}
	}
	// No match. catch it
	catch (e) {
		
				try {document.getElementById(messageElement).innerHTML = errorStringNumbers;}
				catch (e){ }
				return;	
	}
    */	


	// Length match
	if ( password.length < 6) {
			try { document.getElementById(messageElement).innerHTML = errorStringLength;  }
			catch (e) { }
			return;
	}

	else {
			
			try {document.getElementById(messageElement).innerHTML = ''; }
			catch (e) {}
	
	}
	
	
}
/**
 * Method that checks match on to values.
 * 
 * @param string password
 * @param string PasswordRepeat
 * 
 * @return boolean true on match oposites on false 
 * 
 */
function aliasCheckPasswordMatch (password,passwordRepeat) {
	if (password === passwordRepeat) {
	return true;
    }
	else { return false }
	
}





/** ====== End DLS Alias functions ===== */
/** ====== End DLS Profile functions ===== */
