// support for details section show/hide animation/flag handling

dojo.require("dojo.lfx.*");
dojo.require("dojo.io.*");
dojo.require("dojo.widget.Dialog");
dojo.require("dojo.widget.DropdownDatePicker");
dojo.require("dojo.event.*");

// global flag count padding amount
var pad_amount = 2;

// helper for pre-pending spacers in a string
function padString(str, pad) {
  if (str.length > 0 && pad > str.length) {
    var amount = pad - str.length;
    for (var i=0; i <= amount; i++) {
      str = '&nbsp;' + str;
    }
  }
  return str;
}

// helper for padding a number with zeroes
function padNumber(num, pad) {
  var str= num.toString();
  return padString(str, pad);
}

// strip all non-number characters from a string
function getNumber(str) {
  var numStr = '';
  var numbers = '0123456789';
  for (var i=0; i < str.length; i++) {
    var c = str.substr(i, 1);
    if (numbers.indexOf(c) > -1) {
      numStr += c;
    } else {
    }
  }
  if (numStr.length == 0) {
    return 0;
  }
  return parseInt(numStr);
}

// flag onclick handler
function change_flag() {
  var state = '0';

  // get image to flip src out (flip color)
  var imgs = this.getElementsByTagName('img');
  var flag = null;
  for (var i=0; i < imgs.length; i++) {
    if (imgs[i].src.indexOf('flag') > -1) {
      flag = imgs[i];
      break;
    }
  }

  if (flag == null) {
    return;
  }

  // need to manipulate event counts by hand here
  var color_count = null;
  var count = 0;
  var divs = this.getElementsByTagName('div');
  for (var i=0; i < divs.length; i++) {
    if (divs[i].className.indexOf('flag_count') > -1) {
      color_count = divs[i];
      count = getNumber(color_count.innerHTML);
      break;
    }
  }

  // do some flippin'
  if (flag.src.indexOf('grey') > -1) {
    flag.src = flag.src.replace('grey', 'blue');
    state = '1';
    if (color_count) {
      count += 1;
      color_count.innerHTML = padNumber(count, pad_amount);
      color_count.style.color = '#fff';
    }
  }
  else {
    flag.src = flag.src.replace('blue', 'grey');
    if (color_count) {
      count -= 1;
      if (count == 0) {
        color_count.innerHTML = '';
      }
      else {
        color_count.innerHTML = padNumber(count, pad_amount);
        color_count.style.color = '#159';
      }
    }
  }
  
  // update main site
  dojo.io.bind({
    method: 'POST',
    url: '/events/'+flag.id+'/flags/'+state+'/',
    sync: true,
    handle: function(type, data, event) {}
  });
}

// flags filter onclick (submit) handler
function filter_flags(filter) {
  if (filter.parentNode) {
    filter.parentNode.submit();
  }
}

// keyword filter onclick handler
function filter_keyword(keyword) {
  var keyword_dlg = dojo.widget.byId("keyword_content");
  if (keyword_dlg) {
    var btn = document.getElementById("keyword_ok");
    if (btn) {
      keyword_dlg.setCloseControl(btn);
    }
    var btn = document.getElementById("keyword_cancel");
    if (btn) {
      keyword_dlg.setCloseControl(btn);
    }
    keyword_dlg.show();

    // todo, on focus does not work right
    var text = document.getElementById('keyword_text');
    if (text) {
      text.focus();
    }
  }
}

// venue filter onclick handler
function filter_venue(venue) {
  var venue_dlg = dojo.widget.byId("venue_content");
  if (venue_dlg) {
    var btn = document.getElementById("venue_ok");
    if (btn) {
      venue_dlg.setCloseControl(btn);
    }
    var btn = document.getElementById("venue_cancel");
    if (btn) {
      venue_dlg.setCloseControl(btn);
    }
    venue_dlg.show();

    // todo, on focus does not work right
    var text = document.getElementById('venue_text');
    if (text) {
      text.focus();
    }
  }
}

// date set handler
function date_from_handler(evt) {
  df = dojo.widget.byId("date_from");
  if (!df) {
    return true;
  }
  dt = dojo.widget.byId("date_to");
  if (dt) {
    dt.datePicker.setDate(df.datePicker.storedDate);
    dt.datePicker.startDate = df.datePicker.date;
    dt.inputNode.value = df.inputNode.value;
  }
  return true;
}

// date filter onclick handler
function filter_date(keyword) {
  var date_dlg = dojo.widget.byId("date_content");
  if (date_dlg) {
    var btn = document.getElementById("date_ok");
    if (btn) {
      date_dlg.setCloseControl(btn);
    }
    var btn = document.getElementById("date_cancel");
    if (btn) {
      date_dlg.setCloseControl(btn);
    }

    // disable inputNodes of datepickers
    var df = dojo.widget.byId("date_from");
    if (df) {
      df.inputNode.disabled = true;
    }
    dt = dojo.widget.byId("date_to");
    if (dt) {
      dt.inputNode.disabled = true;
    }

    // connect setDate event in date_from widget
    dojo.event.connect(df, "onSetDate", date_from_handler);
    date_dlg.show();
  }
}

// submit date filter handler
function submit_date(date_form) {
  var date_from = dojo.widget.byId("date_from");
  var date_to = dojo.widget.byId("date_to");

  if (!date_from || !date_to) {
    return false;
  }

  date_form.date_from.value = date_from.inputNode.value;
  date_form.date_to.value = date_to.inputNode.value;
  
  return true;
}

// do lots of prep for events page
function prepare_events() {
  if (!document.getElementById) {
    return;
  }

  var events = document.getElementById('events');
  if (!events) {
    return;
  }
  
  // grab all event flags
  var imgs = events.getElementsByTagName('img');
  for (var i=0; i < imgs.length; i++) {
    if (imgs[i].src.indexOf('flag') > -1) {
      var div = imgs[i].parentNode;
      if (div) {
        div.onclick = change_flag;
      }
      // pad numbers in javascript
      var fdivs = div.getElementsByTagName('div');
      for (var j=0; j < fdivs.length; j++) {
        if (fdivs[j].className.indexOf('flag_count') > -1) {
          var count = parseInt(fdivs[j].getAttribute('flag_count'));
          if (count > 0) {
            fdivs[j].innerHTML = padNumber(count, pad_amount);
          }
          break;
        }
      }
    }
  }
  
  // look for all events with description sections
  var divs = events.getElementsByTagName('div');
  for (var i=0; i < divs.length; i++) {
    if (divs[i].className == 'event_desc') {
      var desc = divs[i];
      var event = desc.parentNode;
      
      // find more info... link
      var info_link = null;
      var links = event.getElementsByTagName('a');
      for (var j=0; j < links.length; j++) {
        if (links[j].className == 'desc_tag') {
          info_link = links[j];
          break;
        }
      }
      
      if (!info_link) {
        continue;
      }
      
      // setup info link to do its thing
      info_link.desc = desc;
      info_link.visable = false;
      info_link.onclick = function() {
        if (this.innerHTML == 'less info...') {
          dojo.lfx.wipeOut(this.desc, 250).play();
          this.innerHTML = 'more info...';
        }
        else {
          dojo.lfx.wipeIn(this.desc, 250).play();
          this.innerHTML = 'less info...';
        }
      }
    }
  }
}

dojo.addOnLoad(prepare_events);
