// WHY DOESN'T THIS WORK???
function dump(object) {
    var str;
    for (var prop in object) {
      str += prop + ": " + this[prop] + "\n";
    }
    return str;
}

function get_string_tag_value(form_name, name) {
  return document[form_name][name].value;
}

//Clears tag if it's not numeric
function get_numeric_tag_value(form_name, name) {
  var raw = get_string_tag_value(form_name, name);
  var cooked = parseFloat(raw);
  if (isNaN(cooked)) {
    clear_tag(form_name, name);
    return;
  }
  else {
    return cooked;
  }
}

function get_radio_tag_value(form_name, name) {
  var tags = document[form_name][name];
  var tag;
  for (var i=0; i<tags.length; i++) {
    tag = tags[i];
    if (tag.checked) return tag.value;
  }
  return "";
}

// function get_radio_tag_value(form_name, name) {
//   var tags = document.getElementsByTagName(name);
//   var tag;
//   for (var i=0; i<tags.length; i++) {
//     tag = tags[i];
//     if (tag.getAttribute("checked")) return tag.getAttribute("value");
//   }
//   return "";
// }

function get_checkbox_value(form_name, name) {
  return document[form_name][name].checked;
}

function set_tag_value(form_name, name, value) {
  document[form_name][name].value = value;
}

function clear_tag(form_name, name) {
  set_tag_value(form_name, name, "");
}

function defined(value) {
  if (value == 0) return true;
  return value != null && value != "" && value != undefined;
}

function all_defined(array) {
  
  for (var i=0; i<array.length; i++) {
    if (!defined(array[i])) {
      return false;
    }
  }
  return true;
}

function clear_selector(id) {
   var selector = document.getElementById(id);
   selector.options.length = 0;
}        

function get_selected(id)  {
   var selector = document.getElementById(id);
   if (selector) {
      var sel_index = selector.selectedIndex;
      return selector.options[sel_index].value;
      }
   else { return null; }    
}

function get_selected_by_name(form_name, name)  {
  var selector = document[form_name][name];
   if (selector) {
      var sel_index = selector.selectedIndex;
      return selector.options[sel_index].value;
      }
   else { return null; }    
}

function toggle_visible(onButtonId, offButtonId, targetId) {
  if (onButtonId && offButtonId && targetId) {
    var targetStyle = document.getElementById(targetId).style;
    var onButton    = document.getElementById(onButtonId);
    var offButton   = document.getElementById(offButtonId);
    if (targetStyle.display == 'block') {
      targetStyle.display = 'none';
      onButton.style.display = 'block';
      offButton.style.display = 'none';
    }
    else  {
      targetStyle.display = 'block';   
      onButton.style.display = 'none';
      offButton.style.display = 'block';
    }
  }
  else {
    alert('Missing required arg in utils:toggle_visible')     
  }
}

// Could have been written a little simpler using 'this' -- see update_todo_list
function toggle_permissions_select(formId) {
  var club_select = document.getElementById(formId + '_cid');
  var club_permissions = document.getElementById(formId + '_cpdiv');
  var user_permissions = document.getElementById(formId + '_updiv');
  var club_select = document.getElementById(formId + '_cid');
  var index = club_select.selectedIndex;
  var selected = club_select.options[index].value;
  if (selected == 'NULL') {
    club_permissions.style.display = 'none';
    user_permissions.style.display = 'block';
  }
  else {
    club_permissions.style.display = 'block';
    user_permissions.style.display = 'none';
  }
}

function toggle_reply(onButtonId, offButtonId, formId) {
  if (onButtonId && offButtonId && formId) {
    var bodyId = formId + '_body';
    var divId  = formId + '_div';
    var replyStyle = document.getElementById(divId).style;
    var replyBody = document.getElementById(bodyId); 
    var onButton = document.getElementById(onButtonId);
    var offButton = document.getElementById(offButtonId);
    if (replyStyle.display == 'block') {
      hide_editor(bodyId);
      replyStyle.display = 'none';
      onButton.style.display = 'block';
      offButton.style.display = 'none';
    }
    else {
      show_editor(bodyId);
      replyStyle.display = 'block';   
      onButton.style.display = 'none';
      offButton.style.display = 'block';
    }
  }
  else {
    alert('Missing required arg in utils:toggle_reply')     
  }
}

function hide_editor(bodyId) {
  tinyMCE.execCommand("mceRemoveControl", false, bodyId);  
}

function show_editor(bodyId) {
  tinyMCE.execCommand("mceAddControl", false, bodyId);
}

function toggle_buttons(onButtonId, offButtonId) {
  var onButton = document.getElementById(onButtonId);
  var offButton = document.getElementById(offButtonId);
  if (onButton.style.display == 'none') {
    onButton.style.display = 'block';
    offButton.style.display = 'none';
  }
  else  {
    onButton.style.display = 'none';
    offButton.style.display = 'block';
  }
}

function toggleList(tree_id) {
    var element = document.getElementById(tree_id);
    if (element) {
        if (element.style.display == 'none') {
            element.style.display = 'block';    
        }
        else {
            element.style.display = 'none';    
        }
    }
}

function choose_page_form() {
   var selected = document.pts.page_type_selector.selectedIndex;
   var options = document.pts.page_type_selector.options;

   var page_form;
   var block;
   // Start from i=1 to skip the "Select one" option
   for (var i = 1; i < options.length; i++) {
     page_form = options[i].value + '_form';
     block = document.getElementById(page_form);
     if (i == selected) {
	block.style.display = "block";
     }
     else {
        block.style.display = "none";
     }    
   }
} // end choose_page_form()

function choose_location_form() {
   var selected = document.lts.location_type_selector.selectedIndex;
   var options = document.lts.location_type_selector.options;
   var location_type;
   var location_form;
   var block;
   // Start from i=1 to skip the "Select one" option
   for (var i = 1; i < options.length; i++) {
     location_form = options[i].value + '_fields';
     block = document.getElementById(location_form);
    if (i == selected) {
        location_type = options[i].value;
	block.style.display = "block";
     }
     else {
        block.style.display = "none";
     }    
   }
   var location_type_tag = document.getElementById("location_type_tag");
   if (location_type == 'none') {
      location_type_tag.value = '';
   }
   else if (!(location_type == undefined)) {
      location_type_tag.value = location_type;
   }
} // end choose_location_form()

function mark_read(id) {
  var unread_id = "unread_feed" + id;
  var read_id = "read_feed" + id;
  document.getElementById(unread_id).style.display = 'none';
  document.getElementById(read_id).style.display = 'inline';
  return;
}

function sys_update_todo_list(checkbox, master_id) {
  if (!master_id) return;
  if (checkbox.checked) {
    var url = "/sys/new_page/action/" + master_id;
    var req = new Ajax.Request(
                               url,
                               {method: 'post',
                                onSuccess: update_todo_label,
                                onFailure: notify_todo_failure
                               }
                               );
  }
  else {
    alert("Sorry, that's not implemented yet!");
    checkbox.checked = true;
  }
}// end sub update_todo_list

function update_todo_label(req) {
  var label = document.getElementById('update_todo_label');
  if (label) {
    label.innerHTML = " Todo item added";
  }
}

function sys_join_club(checkbox, club_id) {
  if (checkbox.checked) {
    var url = "/sys/join_club/" + club_id;
    var req = new Ajax.Request(
                               url,
                               {method: 'post',
                                onSuccess: update_join_club_label,
                                onFailure: notify_join_club_failure
                               }
                               );
  }
  else {
    alert("Sorry, that's not implemented yet!");
    checkbox.checked = true;
  }
}// end sub update_todo_list

function update_join_club_label(req) {
  var label = document.getElementById('join_club_label');
  if (label) {
    label.innerHTML = " Request received";
  }
}

function notify_todo_failure(req) {
  var response = req.responseText ?
    req.responseText :
      "Failed to add todo item!";
  var checkbox = document.getElementById('add_todo_checkbox');
  checkbox.checked = false;
  alert(response);
  return;
}

function notify_join_club_failure(req) {
  var response = req.responseText ?
    req.responseText :
      "Failed to process request!";
  var checkbox = document.getElementById('join_club_checkbox');
  checkbox.checked = false;
  alert(response);
  return;
}

function notify_tags_failure(req) {
  var response = req.responseText ?
    req.responseText :
      "Failed to update tags!";
  alert(response);
  return;
}

function sys_tags(tag_form_id, tag_block_id, page_id) {
  var tag_str = document.getElementById(tag_form_id).tag_str.value;
  var tag_block = document.getElementById(tag_block_id);
  var url = "/sys/tags/" + page_id;
  var params = "tag_str=" + tag_str;
  var req = new Ajax.Request(
                             url,
      {method: 'post',
       parameters: params,
       onSuccess: update_tags,
       onFailure: notify_tags_failure
      }
                             );
  tag_block.style.display = 'none';
  toggle_buttons(tag_form_id + '_on_button', tag_form_id + '_off_button');
  return;  
}

function update_tags(req) {
  var responseText = req.responseText;
  var tagbar = document.getElementById('tagbar');
  var tagStrSpan = document.getElementById('tag_str_span');
  if (responseText == '__EMPTY_TAG_STR__') {
    tagStrSpan.innerHTML = '';    
  }
  else {
    tagbar.style.display = 'block'; // In case it's still hidden
    tagStrSpan.innerHTML = responseText;
  }
  return;
}

function update_feed_counts(user_id) {
  var feedlinks = document.getElementsByClassName('feedlink'); //this is also from prototype.js
  var url = '/pub/sys/feedcount/';
  var feed_id;
  var feedlink;
  for (var i=0; i<feedlinks.length; i++) {
    feedlink = feedlinks[i];
    feed_id = feedlink.getAttribute('id');
    feed_id = feed_id.substring(4); // example id: 'feed32' -- XHTML doesn't allow all digits
    if (feed_id) {
      var req = new Ajax.Request(
                                 url + feed_id,
                                 {method: 'post',
                                  onSuccess: update_feed_label}
                                 );

    }
  }
}// end update_feed_counts

function update_feed_label(req) {
  // I could not get the responseXML to work -- came back null!
  //  var data = req.responseXML.documentElement;
  //  var data = req.responseXML;
  //  var count = data.getElementsByTagName('feedcount')[0];
  var data = req.responseText.split(":");
  var feed_id = data[0];
  var count = data[1];
  if (feed_id) {
    var feedlink = document.getElementById('feed' + feed_id);
    var count_display = feedlink.nextSibling;
// alert(count_display.nodeName);
// alert("val: " + count_display.nodeValue);
    var count_txt;
    if (count > 0) {
      feedlink.style.fontWeight = 'bold';
      count_txt = document.createTextNode(" ("+count+")");
      count_display.appendChild(count_txt);
      count_display.style.fontWeight = 'bold';
      count_display.style.display = 'inline';
     }
    else {
      count_txt = count_display.firstChild;
      if (count_txt) count_display.removeChild(count_txt);
      //      count_display.style.display = 'none';
      feedlink.style.fontWeight = 'normal';    
    }
  }
}// end update_feedlink

function jump_to_page(selector, page_type) {
  var page_id = get_selected(selector);
  var url = '/pub/page/show/' + page_type + '/' + page_id;
  location.href = url;
  return;
}

/*************************************

  DOM INSPECTOR

*************************************/

// First call should set level=0
function nodeToString(level, node) {
  
  var str = '';
  var indent = getIndent(level);

  str += indent + node.nodeName + ': ';
  if (node.nodeValue) str += node.nodeValue;
  str += '\n';

  for (var i=0;i<node.childNodes.length;i++) {
    var nextNode = node.childNodes[i];
    str += nodeToString(level+1, nextNode)
  }
  return str;
}

function getIndent(level) {

  var indent = '';
  for (var i=0;i<level;i++) {
    indent += '....';
  }
  return indent;

}

