function openWindow(url, name, features) {
  popup = window.open(url,name,features);
  popup.focus();
}


function confirmOrganiserDelete(organiser_pk, organiser_name, doc_root) {
  if (confirm('Vill du ta bort ' + organiser_name + '?')) {
    location.replace(doc_root + 'pro/sin.php?page=search_organisers&delete=' + organiser_pk);
  }
}


function confirmEventDelete(event_pk, event_name, doc_root) {
  if (confirm('Vill du ta bort ' + event_name + '?')) {
    location.replace(doc_root + 'pro/sin.php?page=events&delete=' + event_pk);
  }
}


function confirmTypeDelete(type_pk, parent_pk, type_name, doc_root, type_of) {
  var message = 'Vill du ta bort ' + type_name + '?';
  if (parent_pk == '0') {
    message = 'Vill du ta bort ' + type_name + ' och dess undertyper?';
  }
  if (confirm(message)) {
    location.replace(doc_root + 'pro/sin.php?page=type&type_of=' + type_of + '&delete=' + type_pk);
  }
}


function confirmLongEvent(form) {
  var start_date = validateDateFormat(form.event_start_date.value);
  var start_time = validateTimeFormat(form.event_start_time.value);
  var end_date   = validateDateFormat(form.event_end_date.value);
  var end_time   = validateTimeFormat(form.event_end_time.value);

  for(var i = 0; i < start_date.length; i = i + 1)
  {
	  if (start_date[i] && start_time && end_date[i] && end_time) {
	    var s = start_date[i].split("-").concat(start_time.split(":"));
	    var e = end_date[i].split("-").concat(end_time.split(":"));
	    s = new Date(s[0], s[1], s[2], s[3], s[4], 0);
	    e = new Date(e[0], e[1], e[2], e[3], e[4], 0);
	    if((e.getTime() - s.getTime()) > 24 * 3600000 - 1) 
	      return confirm('Du har registrerat ett evenemang som är längre än ett ' +
	                     'dygn - bekräfta att du vill spara detta.');
	  }
  }
  return true;
}


function showDistricts(me) {
  var chosen_region = me.value;
  var form = document.forms[0];
  var select_name = 'district';
  var select_box = form.elements[select_name];
  select_box.options.length=0;
  if (regions[chosen_region] != null) {
    var i = 0;
    for (tmp in regions[chosen_region]) {
      select_box.options[i] = new Option(regions[chosen_region][tmp], tmp, false, false);
      i++;
    }
  } else {
    select_box.options[0] = new Option ('Välj först stad', 0, false, false);
  }
}


function showAreas(me) {
  var chosen_district = me.value;
  var form = document.forms[0];
  var select_name = 'area';
  var select_box = form.elements[select_name];
  select_box.options.length=0;
  if (districts[chosen_district] != null) {
    var i = 0;
    for (tmp in districts[chosen_district]) {
      select_box.options[i] = new Option(districts[chosen_district][tmp], tmp, false, false);
      i++;
    }
  } else {
    select_box.options[0] = new Option ('Välj först område', 0, false, false);
  }
}


function updateEventEndDate(me)
{
    var start_date = me.value;
    var form = document.forms[0];
    var end_date = form.elements['event_end_date'];
    if (! end_date.value ||
        start_date.replace(/-/g, "") > end_date.value.replace(/-/g, ""))
    {
        end_date.value = start_date;
    }
}


function updateSearchEventEndDate(me)
{
    var start_date = me.value;
    var form = document.forms[0];
    var end_date = form.elements['end_date'];
    if (! end_date.value ||
        start_date.replace(/-/g, "") > end_date.value.replace(/-/g, ""))
    {
        var date = (parseInt(start_date, 10) + 1).toString();
        end_date.value = date.length == 5 ? "0" + date : date; 
    }
}


function setupSearchEventCalendar(button, dateInput)
{
    Calendar.setup(
        {
            align          : "Br",
            button         : button,
            cache          : true,
            dateStatusFunc : passedDate,
            firstDay       : 1,
            ifFormat       : "%y-%m-%d",
            inputField     : dateInput,
            range          : [2000, 2100],
            showOthers     : true,
            showsTime      : false,
            singleClick    : false,
            step           : 1
        }
    );
}

var MA = [];
function setupEventInputCalendar(button, dateInput, timeInput)
{		
    Calendar.setup(
        {
        	align          : "BR",
        	multiple       : MA, // pass the initial or computed array of multiple dates
            button         : button,
            cache          : true,
            dateStatusFunc : passedDate,
            firstDay       : 1,
            ifFormat       : "%y-%m-%d",
            inputField     : dateInput,
            inputField2    : timeInput,
            onClose        : setEventTimeInput,
            range          : [2000, 2100],
            showOthers     : true,
            showsTime      : true,
            singleClick    : false,
            step           : 1
        }
    );
}


function setEventTimeInput(cal)
{
	var el_start_date = document.getElementById("event_start_date_input");
	var el_end_date = document.getElementById("event_end_date_input");
	
	if (cal.params.inputField == 
        document.getElementById("event_start_date_input"))
    {
		// reset initial content.
		el_start_date.innerHTML = "";
		el_end_date.innerHTML = "";
		// Reset the "MA", in case one triggers the calendar again.
		// CAREFUL! You don’t want to do "MA = [];". We need to modify
		// the value of the current array, instead of creating a new one.
		// Calendar.setup is called only once! :-) So be careful.
		MA.length = 0;
		for (var i in cal.multiple) {
			var d = cal.multiple[i];
			// sometimes the date is not actually selected,
			// so let’s check
			if (d) {
				// OK, selected. Fill an input field or something.
				el_start_date.innerHTML += d.print("%y-%m-%d") + "\n";
				var add_day = document.getElementById("event_duration").value * 86400000
				var end_d = new Date(d.getTime() + add_day);
				el_end_date.innerHTML += end_d.print("%y-%m-%d") + "\n";
				// and push it in the "MA", in case one triggers the calendar again.
				MA[MA.length] = d;
			}
		}
	}
	else {
		// reset initial content.
		el_end_date.innerHTML = "";
		// Reset the "MA", in case one triggers the calendar again.
		// CAREFUL! You don’t want to do "MA = [];". We need to modify
		// the value of the current array, instead of creating a new one.
		// Calendar.setup is called only once! :-) So be careful.
		MA.length = 0;
		for (var i in cal.multiple) {
			var d = cal.multiple[i];
			// sometimes the date is not actually selected,
			// so let’s check
			if (d) {
				// OK, selected. Fill an input field or something.
				el_end_date.innerHTML += d.print("%y-%m-%d") + "\n";
				// and push it in the "MA", in case one triggers the calendar again.
				MA[MA.length] = d;
			}
		}
	}
		
	cal.hide();
	
	
    var timeInput, hours, minutes;

    if (cal.params.inputField == 
        document.getElementById("event_start_date_input"))
    {
        timeInput = document.getElementById("event_start_time_input");
    }
    else
    {
        timeInput = document.getElementById("event_end_time_input");
    }

    hours   = cal.date.getHours();
    minutes = cal.date.getMinutes();
    hours   = hours < 10   ? "0" + hours : hours;
    minutes = minutes < 10 ? "0" + minutes : minutes;
    timeInput.value = hours + ":" + minutes;
}


function passedDate(date)
{
    // time of given date is 12:00  (12 * 3600 * 1000 = 43200000)
    return (new Date() > date.getTime() + 43200000) ? true : false;
}


/* Register event handler to click save button when Enter key is pressed */
function saveOnEnterEventHandler ()
{
    if (document.addEventListener)   // Mozilla
        document.addEventListener('keypress', saveOnEnter, true);
    else if (document.attachEvent)   // MSIE
        document.attachEvent('onkeypress', saveOnEnter);
    else                             // Old MSIE
        document.onkeypress = saveOnEnter;
}


/* Validate that given date format is any of "[YY]YY-MM-DD" or "[YY]YYMMDD",
 * and do rudimentary date validation (final date validation is assumed to be
 * done by server). If validation succeds, return a date string as
 * "YYYY-MM-DD", otherwise an empty string is returned.
 *
 */

function validateDateFormat (dates)
{
    // Allowed input formats: [YY]YY-MM-DD or [YY]YYMMDD
    var dateFormat = /^(\d{2})?(\d{2})-?(\d{2})-?(\d{2})$/

    var validDate  = [];
    var validDate_new = "";
    var length = 0;
    dates = dates.split("\n");
    if(dates.length == 1)
    	length = 1;
    else 
    	length = dates.length - 1;
    for(var i = 0; i < length; i = i + 1) 
    {
	    date = dates[i];
	    if (dateFormat.test (date))
	    {
	        var cc = RegExp.$1;
	        var yy = RegExp.$2;
	        var mm = RegExp.$3;
	        var dd = RegExp.$4;
	        var yyyy;
	
	        // First a basic date validity check
	        if (mm > 0 && mm < 13 && dd > 0 && dd < 32)
	        {
	            // When century was not given: set date to be within the last 80
	            // and next 20 years (adjustment for 22th century needed 2079 :) )
	            if (cc == "")
	            {
	                var now = new Date ();
	                yy      = parseInt (yy, 10);
	
	                if ((now.getFullYear () + 21) > (yy + 2000))
	                  yyyy = yy + 2000;
	                else
	                  yyyy = yy + 1900;
	            }
	            else
	            {
	                yyyy = cc.concat (yy);
	            }
	
	            validDate_new = yyyy + "-" + mm + "-" + dd;
	        }
	    }
	    
	    validDate[i] = validDate_new;
    }

    return validDate;
}


/* Validate that given time format is any of "HH:MM" or "HHMM",
 * and do rudimentary time validation (final validation is assumed to be
 * done by server). If validation succeds, return a time string as
 * "HH:MM", otherwise an empty string is returned.
 *
 */

function validateTimeFormat(time)
{
    // Allowed input formats: HH:MM or HHMM
    var timeFormat = /^(\d{2}):?(\d{2})$/

    var validTime  = "";

    if (timeFormat.test (time))
    {
        var hh = RegExp.$1;
        var mm = RegExp.$2;

        // First a basic time validity check
        if (hh > -1 && hh < 25 && mm > -1 && mm < 60)
        {
            validTime = hh + ":" + mm;
        }
    }
    return validTime;
}


/* Click save when Enter key is pressed except for textareas and buttons */
function saveOnEnter (e)
{
    if (typeof window.event != "undefined")   // MSIE
    {
        e        = window.event;
        e_target = e.srcElement;
    }
    else
    {
        e_target = e.target;
    }

    if (isKeyEnter (e) &&
        e_target.type != 'button' &&
        e_target.type != 'submit' &&
        e_target.type != 'textarea')
    {
        document.getElementById('save').click();
        return false;
    }

    return true;
}


/* Return true if browser is MSIE, if not return false */
function isBrowserMSIE ()
{
    return navigator.userAgent.indexOf ("MSIE") != -1;
}


/* Return true when Enter key ('CR') is pressed */
function isKeyEnter (evt)
{
    var key   = isBrowserMSIE () ? window.event.keyCode : evt.which;
    var keyCR = "\r".charCodeAt(0);
    return key == keyCR;
}

