/***********************************************************************
 * ade.js
 *
 * JavaScript for ade.cgi
 *
 * Uses the jQuery JavaScript Library, the jQuery-Plugins autocomplete &
 * tooltip, and optionally dimension & bgiframe.
 *
 * Also depends on adejs.cgi for AJAX-queries.
 * 
 * Author: Magnus Herold
 ***********************************************************************/


var ade_valid = false;          // prefix ade_ to avoid name-clashes

// returns string with &<> replaced by &amp;&lt;&gt;.
function escapeHTML(s) {
  return s.toString().replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
}

jQuery.noConflict();
jQuery(document).ready(function($) {

  // Make extended options dynamic
  var dyn_div = $('table.ade div.dyn');
  if ($(':hidden[name=extset]').val() == 'close') dyn_div.hide();

  var dyn_a = $('table.ade a.dyn');
  dyn_a.parent().parent().show();

  dyn_a.click(function() {
    var extset = $(':hidden[name=extset]');
    if (extset.val() == 'open') {
      $('img', this).attr('src', '/im/plus.gif');
      dyn_div.hide();
      extset.val('close');
    }
    else {
      $('img', this).attr('src', '/im/minus.gif');
      dyn_div.show();
      extset.val('open');
    }
  });

  // Set up special subcon-value to signal JavaScript to ade,
  // needed to bypass unnecessary "please click continue once more..."
  //$('[name=subcon]').val('continue_js');
  $(':hidden[name=lang]')
    .after('<input type="hidden" value="true" name="js"/>');

  // Get cid and lang from document
  var lang = $(':hidden[name=lang]').val();
  var cid = $(':hidden[name=cid]').val();

  // Set up the tooltips
  $('[tooltiptext]').each(function() {
    $(this).attr('title', $(this).attr('tooltiptext'));
  });
  $('[title]').tooltip({
    showURL: false,
    track: true,
    delay: 0,
    top: -5,
    left: 20
    //fade: 200
  });

  // enable help-popups
  $('a[target=help]').removeAttr('onclick')
    .click(function() {
      var ops = 'channelmode=no, directories=no, fullscreen=no, location=no, menubar=no, resizable=yes, scrollbars=yes, status=no, titlebar=no, toolbar=no';
      window.open(this.href, 'help', 'width=400, height=400, ' + ops);
    });

  // date_place Object
  var date_place = {
    mapgifname: cid + '.gif',
    get_from_form: function() {
      this.sday = $(':text[name=sday]').val();
      this.imon = $('select[name=imon]').val();
      this.syar = $(':text[name=syar]').val();
      this.ihou = $('select[name=ihou]').val();
      this.smin = $(':text[name=smin]').val();
      this.spli = $('[name=spli]').val();
      this.szon = $('select[name=szon]').val();
    },
    validate: function() {
      var oksday = this.sday >= 1 && this.sday <= 31;
      var okimon = this.imon >= 1 && this.imon <= 12;
      var oksyar = this.syar >= -4000 && this.syar <= 4000;
      var okihou = this.ihou != '' && this.ihou >= 0 && this.ihou <= 23;
      var oksmin = this.smin >= 0 && this.smin <= 59;
      var okscit = Boolean(this.spli);
      var valid = oksday && okimon && oksyar && okihou && oksmin && okscit;
      //alert('validate called.' + valid);
      ade_valid = valid;
      return valid;
    },
    get_ajax: function() {
      dp = this;
      $.get('adejs.cgi', {
	  func: 'get_su_mo_asc_map',
	  lang: lang, 
	  sday: dp.sday, 
	  imon: dp.imon, 
	  syar: dp.syar, 
	  ihou: dp.ihou, 
	  smin: dp.smin, 
	  szon: dp.szon, 
	  spli: dp.spli, 
	  mapgif: dp.mapgifname
	}, 
	function(data) {
	  if (!data) {
	    ade_valid = false;
	    $('#glyphs, #zz').empty();
            $(':checkbox[name=map]').triggerHandler('click');
	    return;
	  }
	  //alert('I' + data + 'I');
	  $(':checkbox[name=map]').triggerHandler('click');
	  var jobj = eval('(' + data + ')');
	  $('#glyphs').empty().append(jobj.sumoasc_html);
	  var time = new Date().getTime();
	  $('#map img').attr('src', '/tmpd/' + dp.mapgifname + '?' + time);
          $('#zz').empty().append(jobj.zz_content_html);
	}
      );
    }
  };

  // is called when a date/time/place/tz - field changes its
  // value. if necessary, an ajax-query is sent to update
  // the glyphs, map and timezone.
  var dp_change_handler = function() {
      //alert('dp_change_handler called.');
      date_place.get_from_form();
      if (date_place.validate()) {
	date_place.get_ajax();
      }
      else {
	$('#glyphs, #zz').empty();
        $(':checkbox[name=map]').triggerHandler('click');
      }
  };

  // load some resources
  /*var res = {};
  $.getJSON('adejs.cgi', { 
      func: 'res',
      lang: lang,
      key: ['lab_event', 'lab_event_warn']
    }, function(data) {
      for (key in data) {
        res[key] = escapeHTML(data[key]);
      }	
    }
  );*/

  // gender-rb's: set handler to show/hide partner reference and 
  // change glyph if necessary
  // also, change text of "event"
  $(':radio[name=ssx]').click(function() {
    var val = $(this).val();
    if (val == 'm') {
      //$('#gend > span:eq(2) span').text(res.lab_event);
      $('#gend > span:eq(2)').show();
      $('#gend > span:eq(3)').hide();
      $('label[for=hom_cb] img').attr('src', '/im/rel_mm.gif');
      $('#hom_tr').show();
    }
    else if (val == 'f') {
      //$('#gend > span:eq(2) span').text(res.lab_event);
      $('#gend > span:eq(2)').show();
      $('#gend > span:eq(3)').hide();
      $('label[for=hom_cb] img').attr('src', '/im/rel_ff.gif');
      $('#hom_tr').show();
    }
    else {
      //$('#gend > span:eq(2) span').text(res.lab_event_warn);
      $('#gend > span:eq(2)').hide();
      $('#gend > span:eq(3)').show();
      $('#hom_tr').hide();
    }
  });

  // map-checkbox, set handler
  $(':checkbox[name=map]').click(function() {
      //alert(this.checked + '|' + ade_valid);
      if (this.checked && ade_valid) { 
	$('#map').show();
      }
      else {
        //$('#map').empty();
        $('#map').hide();
      }
    });  

  // time-zone input, set handler
  $('#tz_input').change(dp_change_handler);

  //var place_query_feedback = function(serr /*searchterm, searchstatus*/ ) {
    //if (searchterm != searchterm2) 
      //alert('st = ' + searchterm + '\nst2 = ' + searchterm2);
    //if (searchstatus > 0) 
      //alert('ss = ' + searchstatus);
    //alert('lulu' + serr);

  //}

  // Make autocomplete for scit-input
  $(':text[name=scit]').autocomplete('adejs.cgi', {
    max: 300,
    minChars: 2,
    cacheLength: 5,
    matchSubset: false,
    mustMatch: false,
    selectFirst: false,
    multipleSeparator: 'abcdexyz', // only workaround for a bug!
    extraParams: {
      func: "place_query",
      sctr: function() { return $('select[name=sctr]').val(); },
      lang: lang
    },
    formatItem: function(rowstr) {
      if (rowstr.length > 2) {
        //if (rowstr[3] != 0) 
          $('#serr_place').empty().append(rowstr[2]);
        //else
          //$('#serr_place').empty();
      }
      /*if (rowstr[0].length > 5) {
        var rowsplit = rowstr[0].split(',');
	var head = rowsplit.shift();
	var tail = rowsplit.join(',');
        return head + ',<small>' + tail + '</small>';
      }*/
      if (rowstr[0].length > 50) {
        return rowstr[0].slice(0, 50);
      }
      return rowstr[0];
    }
  });
  // If a city is selected from the list, create a hidden input "spli"
  $(':text[name=scit]').result(function(e, data, value) {
    if ($(':hidden[name=spli]').length == 0)
      $(this).after('<input type="hidden" name="spli"/>');
    $(':hidden[name=spli]').val(data[1]);
    dp_change_handler();
  });
  $(':text[name=scit]').change(function() { 
    //if (!$.trim($(this).val())) {
      $(':hidden[name=spli]').remove();
      dp_change_handler();
    //}
  });

  // flush the autocomplete-cache if another country is selected 
  // (this is necessary for correct operation)
  $('select[name=sctr]').change(function() {
    $(':text[name=scit]').flushCache();
  });

  // set "change"-handler for date/place inputs
  var dp_inputs = [':text[name=sday]', 'select[name=imon]', ':text[name=syar]',
      'select[name=ihou]', ':text[name=smin]', 'select[name=spli]'];
  $(dp_inputs.join(', ')).change(dp_change_handler);

  // init
  dp_change_handler();
});


