/*
 * Global javascript functions for use in the application
 *
 */
var popUp = new PopUp("popup", "width=395,height=300,top=200,left=200");
var popUpResizable = new PopUp("popupresizable", "width=800,height=600,top=100,left=100,resizable=yes,scrollbars=yes,toolbar=yes,location=yes,menubar=yes,status=yes");

/**
 * This function is the only function that is supposed to be attached on the window.onload handler.
 */
function __init() {
	initQA();
	if (!setFocusOverride()){
		setFocusInFirstField();
	}
	addDatePickers();
  addFAQExpand();
  addClassMembershipExpand();
  addPopUp();
  addButtonSubmit();
  addAutoSubmit();
  addCmfAutoSubmit();
  addDefuseButtons();
  addExpandShadow();
  addValidationMessageJump();
  addAutoFormats();
  __scrollToCoordinates();
  removeSingleSpaceInTextareas();  // does not work for formatted textarea's
}
window.onload = __init;

/**
* Set all checkboxes in the form to the same checked state as _masterCheckbox
* @todo: add the check-all checkbox using javascript matching on class
*/
function allChecked(_masterCheckbox) {
  window._masterChecked = _masterCheckbox.checked;
  $A(_masterCheckbox.form.getElementsByTagName('input')).each(function(_input) {
      if(_input.type=='checkbox') _input.checked = window._masterChecked;
    }
  )
}

/**
* Above function(allChecked) checks all checkboxes.
* If a checkbox is unchecked than the master checkbox must be unchecked 
**/
function unCheckMasterCheckBox(_rowCheckbox){
  if(_rowCheckbox != null && _rowCheckbox.checked == false){
    var _elements = document.getElementsByName("cmd");
    if(_elements != null && _elements.length == 1){
      if(_elements.item(0).value == 'select_all' && _elements.item(0).type == 'checkbox'){
        if(_elements.item(0).checked == true){
          _elements.item(0).checked = false;
        }
      }
    }   
  }
}


/**
 * This function sets the focus in the first possible input field on a page
 *
 */  
function setFocusInFirstField() {		
	// Loop through all the present forms on the page...
	for(var f=0; f < document.forms.length; f++){
		// Skip the loginform...
		if (document.forms[f].id != 'simple-search-form' && 
				document.forms[f].id != 'login-form'){
			// Loop through all the controls on the form...
			for (var e=0; e < document.forms[f].elements.length; e++){
				// Find out if the control is allowed to gain focus...

				if (document.forms[f].elements[e].type != 'hidden' && 
					document.forms[f].elements[e].type != 'submit' && 
					document.forms[f].elements[e].disabled != true && 
					document.forms[f].elements[e].readOnly != true &&
					document.forms[f].elements[e].style.visibility != 'hidden' && 
					document.forms[f].elements[e].style.display != 'none'){
					// Setfocus
					document.forms[f].elements[e].focus();
					// STOP the function
					return;
				}
			}

			// No field found, try second time to find next of finished button
			// start with buttons at the end of the form
			for (var e=document.forms[f].elements.length-1; e >= 0; e--){
				// Find out if the control is allowed to gain focus...

				if (document.forms[f].elements[e].type != 'hidden' && 
					document.forms[f].elements[e].disabled != true && 
					document.forms[f].elements[e].readOnly != true &&
					document.forms[f].elements[e].style.visibility != 'hidden' && 
					document.forms[f].elements[e].style.display != 'none' &&
					(document.forms[f].elements[e].name == 'next' || 
					document.forms[f].elements[e].name == 'finish' || 
					document.forms[f].elements[e].name == 'submit')) {

					document.forms[f].elements[e].focus();
					// STOP the function
					return;
				}
			}
		}
	}	
}

/**
 * Add date pickers to date form elements (inputs of type text with classname date)
 *
 */  
function addDatePickers() {
  var _generated_id_ctr = 0;
  var _date_id = '';
  var _button_id = '';
  $$('input[type="text"].date').each (
    function(_date){
      if(!_date.id) {
        // Make sure we generate a unique id
        while($(_date_id = 'date_' + _generated_id_ctr)) _generated_id_ctr++;
        _date.id = _date_id;
        _generated_id_ctr++;
      }
      // create date button next to date input
      while($(_button_id = _date.id + '_button' + _generated_id_ctr)) _generated_id_ctr++;
      new Insertion.After(_date, '<input type="image" class="calendar_button" id="' + _button_id + '" src="img/icons/calendar.gif"/>');
      // add calendar popup functionality to button
      Calendar.setup({
          inputField  : _date.id,
          ifFormat    : "%d-%m-%Y",
          button      : _button_id
      });
    }
	);
}

/**
* Clicking an 'a.validation-message' link will put the focus on the erronous field
*/
function addValidationMessageJump() {
  addEventHandler('a.validation-message', 'click', 
    function(_event) {
      if(_field = $(Event.element(_event).hash.substr(1))) {
        _field.focus();
        Event.stop(_event);
      }
    }
  );
}

/**
* Adds the _function function as an eventhandler of the event _eventName
* to all elements that match a class selector _classSelector
* @example  addEventHandler('a.validation-message', 'click', _function);
*/
function addEventHandler(_classSelector, _eventName, _function) {
  $$(_classSelector).each(
    function(_element) {
      Event.observe(_element, _eventName, _function);
    }
  );
}

function addAutoFormats() {
  addEventHandler('input.time', 'change', _formatTime);
  addEventHandler('input.date', 'change', _formatDate);
}

function addInputEventHandler(_className, _eventName, _function) {
  document.getElementsByClassName(_className).each (
    function(_element){
      if(_element.type) Event.observe(_element, _eventName, _function);
    }
	);
}

/**
 * Add expand behaviour to classification result classes
 */  
function addClassMembershipExpand() {
  addExpand('class', 'classification-result');
}

/**
 * Add expand behaviour to faq questions (a children of h3.question)
 */  
function addFAQExpand() {
  addExpand('question', 'faq');
}

/**
 * Adds expanding behaviour to divs (e.g. faq)
 * @param   _clickClass       classname of the elements that contain links which 
 *                            trigger the expand or collapse of the parent div (e.g. question)
 * @param   _containerClass   classname of the element containing the 
 *                            expandable div's (e.g. faq)
 */  
function addExpand(_clickClass, _containerClass) {
   document.getElementsByClassName(_clickClass).each(
    function(_question) {
      // Find only those links that should get expand behaviour
      if(_questionLink = _question.up('.' + _containerClass) ? _question.down('a') : false) {
          Event.observe(_questionLink, 'click', function(_event) {
            Event.findElement(_event, 'div').toggleClassName('expanded');
            Event.stop(_event);
          }
        );
      }
    }
	); 
}

function addPopUp() {
  document.getElementsByClassName('popup').each(
    function(_popup) {
      // @todo: make _popup.tagName uppercase
      if(_popup.tagName.toUpperCase()=='A') {
        if(_popup.match('.external')) {
          Event.observe(_popup, 'click', popUpResizable.showProt);
        } else if(_popup.match('.in-page')) {
          var _tooltip = _popup.tooltip = _popup.next();
          Event.observe(_popup, 'click', function(_event) {
              // display the in-page tooltip
              Event.element(_event).tooltip.toggleClassName('visible');
              Event.stop(_event);
            }
          );
          Event.observe(_tooltip, 'click', function(_event) {
              (Event.element(_event).up('.tooltip') || Event.element(_event)).toggleClassName('visible');
            }
          );
          // Move the element up in the document, so that it is not hindered by parent elements
          // that do not overflow
          document.body.appendChild(_tooltip.remove());
          // reposition the tooltip next to the question mark
          Position.clone(_popup, _tooltip, {setWidth: false, 
                                            setHeight: false,
                                            offsetLeft: 10,
                                            offsetTop: 8});
        } else {
          Event.observe(_popup, 'click', popUp.showProt);
        }
      }
    }
	);
}

/* adds autosubmit functionality to questions inside .form-tree forms */
function addAutoSubmit() {
  (document.getElementsByClassName('form-tree').concat(document.getElementsByClassName('form'))).each(
    function(_form) {
      $A(_form.getElementsByTagName('INPUT')).each(
        function(_element) {
          if(_element.type=='text' || _element.type=='password' || _element.type=='file') {
            Event.observe(_element, 'change', __doUpdate);
          } else if(_element.type=='checkbox' || _element.type=='radio') {
            Event.observe(_element, 'click', __doUpdate);
          }
        }
      );
      $A(_form.getElementsByTagName('SELECT')).each(
        function(_element) {
          Event.observe(_element, 'change', __doUpdate);
        }
      );
    }
  );
}

/* the same, but then for form-tree forms within casemanagment forms */
/* TODO: find a solution to generalize the above function and this function */
function addCmfAutoSubmit() {
  var _forms = document.getElementsByName('cmf-form-tree');
  if (typeof _forms != 'undefined') {
    if (typeof _forms[0] != 'undefined') {
      var _form = _forms[0];
      $A(_form.getElementsByTagName('INPUT')).each(
        function(_element) {
          if(_element.type=='text' || _element.type=='password' || _element.type=='file') {
            Event.observe(_element, 'blur', __doUpdate);
          } else if(_element.type=='checkbox' || _element.type=='radio') {
            Event.observe(_element, 'click', __doUpdate);
          }
        }
      );
      $A(_form.getElementsByTagName('SELECT')).each(
        function(_element) {
          Event.observe(_element, 'change', __doUpdate);
        }
      );
    }
  }
}

function addButtonSubmit() {
  $A(document.getElementsByTagName('BUTTON')).each(
    function(_button) {
      if(_button.type=='submit') {
        Event.observe(_button, 'click', function(_event) {
            var _button = Event.element(_event);
            var _form   = _button.up('form');
            if(_button.getAttributeNode('value').value!=_button.value) {
              _input = document.createElement('input');
              _input.type = 'hidden';
              _input.name = _button.name;
              _input.value = _button.getAttributeNode('value').value;
              // append _input to the div
              _form.firstChild.appendChild(_input);
              // now remove all button names so that IE6 does not submit them
              defuseButtons(_form);
            }
            // save scroll coordinates
	          __saveScrollCoordinates(_form);
          }
        );
      }
    }
  );
}

// add onsubmit remove of button names in IE so that they are not submitted
function addDefuseButtons() {
  $A(document.getElementsByTagName('FORM')).each(
    function(_form) {
      Event.observe(_form, 'submit', function(_event) {
          defuseButtons(Event.element(_event));
        }
      );
    }
  );
}



function __doUpdate(_event) {

  Event.stop(_event);
  var _form = Event.findElement(_event, 'form');
  _form.cmd.value = "updateform";
  __saveScrollCoordinates(_form);
  defuseButtons(_form);
  //_form.focusfield.value = document.activeElement.name;
	var element = Event.element(_event);

  _form.focusfield.value = getNextFieldId(element);
  _form.submit();
}


function getNextFieldId(input) {

	var index = 1;
	var field = input.form[(getIndex(input)+index) % input.form.length];
	while(index <= input.form.length+1 && (field.type == 'hidden' ||  field.disabled == true || field.readOnly == true || field.style.visibility == 'hidden' || field.style.display == 'none')){
		index++;
		field = input.form[(getIndex(input)+index) % input.form.length];
	}

	if (field){
		return field.name;
	}
	
	function getIndex(input) {
		var index = -1, i = 0, found = false;
		while (i < input.form.length && index == -1){
			if (input.form[i] == input){
				index = i;
			} else {
				i++;
			}
		}
		return index;
	}
	
}

// remove button names in IE so that they are not submitted
function defuseButtons(_form) {
  $A(_form.getElementsByTagName('BUTTON')).each(function(_button) {
      if(_button.getAttributeNode('value').value!=_button.value) _button.name = 'ignore_me';
    }
  );
}

function __saveScrollCoordinates(_form) {
  _form.scrollx.value = document.body.parentElement ? document.body.parentElement.scrollLeft : (window.pageXOffset ? window.pageXOffset : 0);
  _form.scrolly.value = document.body.parentElement ? document.body.parentElement.scrollTop  : (window.pageYOffset ? window.pageYOffset : 0);
}

function __scrollToCoordinates() {
  $A(document.getElementsByTagName('FORM')).each(
    function(_form) {
      if(_form.scrollx) {
        if(_form.scrollx.value > 0 || _form.scrolly.value > 0) {
          window.scrollTo(_form.scrollx.value, _form.scrolly.value);
          throw $break;
        }
      }
    }
  );
}

// make sure the page shadow expands to the viewport or the entire document
function addExpandShadow() {
  if(Prototype.Browser.Gecko) {
    /* sniff for FF, IE uses css expression, other browsers unsupported */
    function _setHeight(_height) {
      $$('html')[0].setStyle({height: _height});
      $(document.body).setStyle({height: _height});
      $('bi-container').setStyle({height: _height});
      $('bi-main').setStyle({height: _height});
    }
    function _doCheck() {
      //_setHeight(scrollMaxY ? 'auto' : '100%');
      _setHeight(document.height > window.innerHeight ? 'auto' : '100%');
    }
    _doCheck();
    Event.observe(window, 'overflow', _doCheck);
    Event.observe(window, 'underflow', _doCheck);
  }
}

function setFromUntil(_enabled, el) {
  // Enables or disables date from/until text inputs
  document.getElementById(el + '_from').disabled = !_enabled;
  document.getElementById(el + '_until').disabled = !_enabled;
  document.getElementById('date-from-until').checked = _enabled;
}

function launch(url, windname,x,y) {
	self.name = "opener";
	remote = open(url, windname, "width="+x+",height="+y+",top=0, left=800, toolbar=no, location=no, directories=no, status=no, titlebar=yes, menubar=no, scrollbars=yes, resizable=yes, copyhistory=no");
  	remote.focus();
}

function isLeapYear(aiJaar)
{
	if (aiJaar % 100 == 0){
		if (aiJaar % 400 == 0){ 
			// Deelbaar door 100 en 400, dus schrikkeljaar
			return true;
		}
	}
	else{
		if ((aiJaar % 4) == 0){
			// Deelbaar door 4 is ook schrikkeljaar
			return true;
		}
	}

	// Geen schrikkeljaar
	return false;
}

// _event is a prototype.js Event object
function _formatTime(_event)
{
  var veld = Event.element(_event);
  var waarde = veld.value;
	var tijdScheiding = ':';
	var lsTijdArray;
	var lsHH   = '';
	var lsMM = '';
	var liHH   = 0;
	var liMM = 0;
	var GELDIG	= 1;
	var ONGELDIG_FORMAAT = -1;
	
	// Kleinste lengte die een geldige tijd kan opleveren is 4
	// 0130 of 1:30, grootste lengte is 5, 23:30
	if (waarde.length < 4 || waarde.length > 5 ){
		return ONGELDIG_FORMAAT;
	}

	// Proberen op te delen op datumscheidingsteken
	if (waarde.indexOf(tijdScheiding) != -1){
			lsTijdArray = waarde.split(tijdScheiding);
			if (lsTijdArray.length = 2){
				lsHH = (lsTijdArray[0]) ? lsTijdArray[0] : '';
				lsMM = (lsTijdArray[1]) ? lsTijdArray[1] : '';
			}
	}
	// Als de tijd met separatoren is ingevuld staat er in lsHH een waarde,
	// nu de hh:mm scheiding voor invoer zonder scheidingstekens uitvoeren
	if (lsHH == ''){
		lsHH = waarde.substr(0, 2);
		lsMM = waarde.substr(2, 2);
	}

	if (lsHH == '' || lsMM == ''){
		return ONGELDIG_FORMAAT;
	}
	
	// Nu controleren of de tijd wel geldig is.	
	liHH = parseInt(lsHH,10);
	liMM = parseInt(lsMM,10);

	// UREN
	if(liHH > 23 ){
		return ONGELDIG_FORMAAT;
	} else if (isNaN(liHH)){
		return ONGELDIG_FORMAAT
	}
	
	// Minuten
	if(liMM > 59){
		return ONGELDIG_FORMAAT;
	} else if (isNaN(liMM)){
		return ONGELDIG_FORMAAT
	}

	
	// Voorloopnullen
	if (String(liHH).length < 2) lsHH = '0' + liHH;
	if (String(liMM).length < 2) lsMM = '0' + liMM;

	// Juiste formaat tonen in veld
	veld.value = lsHH + ':' + lsMM;

	// Alles OK	
	return GELDIG;
}

function _formatDate(_event)
{
  return;
  var veld = Event.element(_event);
  var waarde = veld.value;
	var datumScheiding = new Array('-', '/', ' ', '.', '+');
	var lsDatumArray;
	var elNr;
	var lsDag   = '';
	var lsMaand = '';
	var lsJaar  = '';
	var liDag   = 0;
	var liMaand = 0;
	var liJaar  = 0;
	var GELDIG	= 1;
	var ONGELDIG_FORMAAT = -1;
	var ONGELDIG_VROEG = -1;

	// Kleinste lengte die een geldige datum kan opleveren is 6
	// 1-1-01 of 010101, grootste lengte is 10, 31-12-2001
	if (waarde.length < 6 || waarde.length > 10){
		return ONGELDIG_FORMAAT;
	}

	// Proberen op te delen op datumscheidingsteken
	for (elNr = 0; elNr < datumScheiding.length; elNr++){
		if (waarde.indexOf(datumScheiding[elNr]) != -1){
			lsDatumArray = waarde.split(datumScheiding[elNr]);
			if (lsDatumArray.length = 3){
				lsDag   = (lsDatumArray[0]) ? lsDatumArray[0] : '';
				lsMaand = (lsDatumArray[1]) ? lsDatumArray[1] : '';
				lsJaar  = (lsDatumArray[2]) ? lsDatumArray[2] : '';
			}
		}
	}
	// Als de datum met separatoren is ingevuld staat er in lsDag een waarde,
	// nu de dag-maand-jaar scheiding voor invoer zonder scheidingstekens uitvoeren
	if (lsDag == ''){
		lsDag   = waarde.substr(0, 2);
		lsMaand = waarde.substr(2, 2);
		lsJaar  = waarde.substr(4);
	}

	if (lsJaar == '' || lsMaand == '' || lsDag == ''){
		return ONGELDIG_FORMAAT;
	}
	
	if (lsJaar.length != 4 && lsJaar.length != 2) return ONGELDIG_FORMAAT;
	if (isNaN(lsJaar)) return ONGELDIG_FORMAAT;

	//Korte jaarnotatie evalueren
	if (lsJaar.length == 2){
		if (isNaN(lsJaar)){
			return ONGELDIG_FORMAAT;
		}
		else if(parseInt(lsJaar) > 50){
			lsJaar = '19' + lsJaar;
		}
		else{
			lsJaar = '20' + lsJaar;
		}
	}

	// Nu controleren of de datum wel geldig is.	
	liJaar  = parseInt(lsJaar,10);
	liMaand = parseInt(lsMaand,10);
	liDag   = parseInt(lsDag,10);

	// Jaar...
	if( isNaN(liJaar) ){
		return ONGELDIG_FORMAAT;
	}
	// Maand...
	if (liMaand > 12 || liMaand < 1 || isNaN(liMaand)) return ONGELDIG_FORMAAT;
	// Dag...
	if (liDag > 31 || liDag < 1 || isNaN(liDag)) return ONGELDIG_FORMAAT;

	if ((liMaand == 1 || liMaand == 3 || liMaand == 5 || liMaand == 7 || liMaand == 8 || liMaand == 10  || liMaand == 12) && (liDag > 31 || liDag < 1)) return ONGELDIG_FORMAAT;
	if ((liMaand == 4 || liMaand == 6 || liMaand == 9 || liMaand == 11) && (liDag > 30 || liDag < 1)) return ONGELDIG_FORMAAT;
	if (liMaand == 2){
		if (liDag < 1) return ONGELDIG_FORMAAT;

		if (isLeapYear(liJaar)){
			if (liDag > 29) return ONGELDIG_FORMAAT;
   		}
		else{
			if (liDag > 28) return ONGELDIG_FORMAAT;
     		}
   	}
	
	// Voorloopnullen
	if (String(liDag).length < 2) lsDag = '0' + liDag;
	if (String(liMaand).length < 2) lsMaand = '0' + liMaand;

	// Juiste formaat tonen in veld
	veld.value = lsDag + '-' + lsMaand + '-' + lsJaar;

	// Alles OK	
	return GELDIG;
}

// switches a text input to a password input and vice versa
function switch_password(obj, focus) {
	if(obj.outerHTML) {
		id = obj.id;
		val = obj.value;
		if(obj.type=='text') {
			obj.outerHTML = obj.outerHTML.replace('id', 'type="password" id');
		} else {
			obj.outerHTML = obj.outerHTML.replace('type=password', 'type="text"');
		}
		obj = document.getElementById(id);
		if(focus) {
			obj.focus();
			obj.focus(); /* workaround for focusing */
		} else {
			obj.value = val;
		}
	} else {
		obj.type = obj.type=='text' ? 'password' : 'text';
	}
}

function handleSingleSubmit(field) {
	// This function disables the given field and submits the form.
	// Because a disabled field is not send in the request and the application reacts on the presence of a certain field in the request,
	// we also create a hidden field in the form with the name and value of the disabled submit button.

	// Disable the field
	field.disabled = true;	

	// Create a hidden field and append it to the form
	var input = document.createElement("input");
	input.setAttribute("type", "hidden");
	input.setAttribute("name", field.name);
	input.setAttribute("value", field.value);
	field.form.appendChild(input);
	
	// Set the cursor to waiting state...
	document.body.style.cursor='wait';

	// Finally, we can submit the form
	field.form.submit();
}

function togglePasswordField(obj){
	if(obj.value=='Wachtwoord') { 
		obj.value='';
		switch_password(obj, true);
	}
}

// used for showing a button only when javascript is enabled
function scriptButton(_name, _value) {
  document.writeln('<input class="btn" type="submit" name="' + name + '" value="' + _value + '" onclick="print(); return false;" />');
}

// used for showing a button only when javascript is enabled
function showButtonWithAction(_action, _value) {
  document.writeln('<input class="btn" type="button" name="' + _value + '" value="' + _value + '" onclick="javascript:location.href=\''+_action+'\'" />');
}

// used for checking single space in textarea's
// added 20071203 by MWI
function isSingleSpace(value) {
	if (value.length != 1) {
		return false;
	}
	
	// char code 32 = space
	// char code 160 = non braking space
	if (value.charCodeAt(0) ==  32 || value.charCodeAt(0) ==  160) {
		return true;
	}
	return false;
}
	
// does not work for formatted textarea's
function removeSingleSpaceInTextareas() {
	for(var f=0; f < document.forms.length; f++){
		// Skip the loginform and simple search
		if (document.forms[f].id != 'simple-search-form' && 
				document.forms[f].id != 'login-form'){
			for (var e=0; e < document.forms[f].elements.length; e++){
				if (document.forms[f].elements[e].type == 'textarea') {
					if (isSingleSpace(document.forms[f].elements[e].value)) {
						document.forms[f].elements[e].value = '';
					}
				}
			}
		}
	}
}