function htmlise(s) {
  s=s.toString();
  s=s.replace(/&/g, '&amp;');
  s=s.replace(/</g, '&lt;');
  s=s.replace(/>/g, '&gt;');
  s=s.replace(/"/g, '&quot;');
  return s;
}

function isDef(o) {
  return typeof(o)!='undefined';
}
function isStr(o) {
  return typeof(o)=='string';
}
function isBool(o) {
  return typeof(o)=='boolean';
}

function getById(id) {
  if(!isStr(id))
    return id;
  if(document.getElementById)
    return document.getElementById(id);
  if(document.all)
    return document.all[id];
  return null;
}

function getByClass(classname, node, tag) {
  if(node==null)
    node=document;
  if(tag==null)
    tag='*';
  var elements=new Array();
  var idx=0;
  var e=node.getElementsByTagName(tag);
  var re=new RegExp("(^|\\s)"+classname+"(\\s|$)");
  for(var i=0; i<e.length; i++) {
    if(re.test(e[i].className)) {
      elements[idx]=e[i];
      idx++;
    }
  }
  return elements;
}

function getByTagName(tag, node) {
  if(node==null)
    node=document;
  return node.getElementsByTagName(tag);
}

function hasClass(node, classname) {
  var re=new RegExp("(^|\\s)"+classname+"(\\s|$)");
  return re.test(node.className);
}

function addClass(node, classname) {
  var re=new RegExp("(^|\\s)"+classname+"(\\s|$)");
  if(!re.test(node.className))
    node.className+=(node.className ? ' ' : '')+classname;
}

function delClass(node, classname) {
  var re=new RegExp("(^|\\s)"+classname+"(\\s|$)", 'g');
  if(node.className)
    node.className=trim_inside(node.className.replace(re, ' '));
}

function trim(string) {
  return string.replace(/^\s+/, '').replace(/\s+$/, '');
}

function trim_inside(string) {
  return trim(string).replace(/\s{2,}/, ' ');
}

function toggle_blocks() {
  var message='';
  var matchclass=new RegExp("^(show|hide)if(not)?-([^=\\s]+)=(\\S*)$");
  var blocks=getByClass("(show|hide)if(not)?-\\S+");
  for(var i=0; i<blocks.length; i++) {
    var show='undef';
    var classes=blocks[i].className.split(/\s+/);
    for(var j=0; j<classes.length; j++) {
      var matches=matchclass.exec(classes[j]);
      if(matches) {
        var type=matches[1];
        var want=matches[2] ? false : true;
        var control=matches[3];
        var value=matches[4];
        message+=control+' '+type+' '+value+'\n';
        if(show=='undef')
          show=type=='hide';
        var obj=getById(control);
        var button;
        if(obj && obj.tagName=='SELECT') { // workaround for IE
          if((obj.options[obj.selectedIndex].value==value)==want)
            show=type!='hide';
        } else if(button=getById(control+'='+value)) {
          if((button && button.checked)==want)
            show=type!='hide';
        } else if(obj) {
          if((trim(obj.value)==value)==want)
            show=type!='hide';
        }
      }
    }
    if(show && show!='undef') {
      var tag=blocks[i].tagName;
      var display;
      if(tag=='SPAN')
        display='inline';
      else if(tag=='TR')
        display='table-row';
      else if(tag=='TD' || tag=='TH')
        display='table-cell';
      if(!display)
        display='block';
      try {
        blocks[i].style.display=display;
      } catch(e) {
        blocks[i].style.display='block'; // IE doesn't understand table-*
      }
    } else
      blocks[i].style.display='none';
  }
}

// floaters
function create_floater(object, floaterid, o) {
  var loaded=false;
  // Note: the iframe is a fix for IE, which otherwise renders select
  // boxes overtop of the modal window.
  var iframeid=floaterid+'-iframe';
  var iframeobj=$('#'+iframeid);
  if(iframeobj.length==0) {
    $(document.body).append('<iframe id="'+iframeid+'"/>');
    iframeobj=$('#'+iframeid);
    iframeobj.css({
        'background-color': '#ffffff',
        border: 'none',
        position: 'absolute',
        display: 'inline',
        'z-index': 10
      })
      .addClass('floater-iframe')
      .hide();
  }
  var floaterobj=$('#'+floaterid);
  if(floaterobj.length==0) {
    floaterobj=$('<div id="'+floaterid+'"/>')
      .appendTo('body')
      .css({
        'background-color': '#ffffff',
        position: 'absolute',
        display: 'inline',
        'z-index': 20
      })
      .addClass('floater')
      .hide()
      .html(o.loading_html);
  }
  function showatmouse(e) {
    var top=e.pageY+o.off_vert;
    var left=e.pageX+o.off_horiz;
    if(top+floaterobj.height()-$(window).scrollTop()>$(window).height()) {
      top=e.pageY-o.off_vert-floaterobj.height();
      if(top-$(window).scrollTop()<0)
        top=$(window).scrollTop();
    }
    if(left+floaterobj.width()-$(window).scrollLeft()>$(window).width()) {
      left=e.pageX-o.off_vert-floaterobj.width();
      if(left-$(window).scrollLeft()<0)
        left=$(window).scrollLeft();
    }
    $(iframeobj).css({
      top: top+'px',
      left: left+'px',
      width: $(floaterobj).width(),
      height: $(floaterobj).height()
    }).show();
    $(floaterobj).css({
      top: top+'px',
      left: left+'px'
    }).show();
    return false;
  }

  $(object).bind('mouseover', function(e) {
    e.preventDefault();
    $('.floater').hide();
    $('.floater-iframe').hide();
    showatmouse(e);
    $(object).bind('mousemove', showatmouse);
    if(!loaded) {
      loaded=true;
      $.ajax({
        type: o.type,
        url: o.url,
        data: o.data,
        success: function(msg) {
            $(floaterobj).html(msg);
            showatmouse(e);
          }
      });
    }
    return false;
  });

  $(object).bind('mouseout', function(e) {
    $(object).unbind('mousemove', showatmouse);
    $(floaterobj).hide();
    $(iframeobj).hide();
    return false;
  });
}

// member profile popups
(function($) {
  $.fn.extend({
    member_profile: function(memberID, o) {
      o=$.extend({
        off_horiz: 10,
        off_vert: 10,
        loading_html: '<div style="padding: 10px;">Loading...</div>',
        type: 'GET',
        url: '/code/modal_member_profile.php',
        data: 'memberID='+escape(memberID)
      }, o);
      if(memberID)
        return this.each(function() {
          create_floater(this, 'member-profile-floater-'+memberID, o);
        });
    }
  });
})(jQuery);

function sponsorship_pending(type, focus, output) {
  output=$(output);
  if(output.length) {
    output.html('');
    if(focus) {
      $.ajax({
        type: 'POST',
        url: '/code/modal_sponsorship_pending.php',
        data: 'type='+escape(type)+'&focus='+escape(focus),
        success: function(msg) {
          output.html(msg);
        }
      });
    }
  }
}

function verify_member(input, output) {
  input=$(input);
  output=$(output);
  if(input.length && output.length)
    if(!input.attr('value').length)
      alert('Please type the member ID.');
    else {
      output.html('Verifying, please wait...');
      output.show();
      $.ajax({
        type: 'POST',
        url: '/code/modal_verify_member.php',
        data: 'memberID='+escape(input.attr('value')),
        success: function(msg) {
          output.html(msg);
        }
      });
    }
}

function verify_org(input, output) {
  input=$(input);
  output=$(output);
  if(input.length && output.length)
    if(!input.attr('value').length)
      alert('Please type the organization ID.');
    else {
      output.html('Verifying, please wait...');
      output.show();
      $.ajax({
        type: 'POST',
        url: '/code/modal_verify_org.php',
        data: 'orgID='+escape(input.attr('value')),
        success: function(msg) {
          output.html(msg);
        }
      });
    }
}

function search_org(state, name, output, field, o) {
  o=$.extend({
    exclude: false,
    sponsorship_pending: false
  }, o);
  state=$(state);
  name=$(name);
  output=$(output);
  if(state.length && name.length && output.length)
    if(!state.attr('options')[state.attr('selectedIndex')].value || !name.attr('value').length)
      alert('Please select a state and type a full or partial church name first!');
    else {
      output.html('Searching, please wait...');
      output.show();
      $.ajax({
        type: 'POST',
        url: '/code/modal_search_org.php',
        data: 'state='+escape(state.attr('options')[state.attr('selectedIndex')].value)+'&name='+escape(name.attr('value'))+'&field='+escape(field)+'&exclude='+escape(o.exclude)+(o.sponsorship_pending ? '&sponsorship_pending=true' : ''),
        success: function(msg) {
          output.html(msg);
        }
      });
    }
}

(function($) {
  $(document).ready(function() {
    toggle_blocks();
  });
})(jQuery);
