function parentToggler(className, parentSelector){
  return function(el){
    var par = el.up(parentSelector)
    el.onclick = function(){par.toggleClassName(className);return false;}
  }
}
function modder(el){
  el.onclick = function(){
    var action = el.classNames().grep(/(up|down)mod/)[0];
    var itemNode = el.up(".moddable");
    var form = $(el.parentNode);
    new Ajax.Request(form.action, {parameters: Form.serialize(form)});
    var val;
    if(itemNode.hasClassName("upmodded")){
      val = action == "upmod" ? -1 : -2
    }else if(itemNode.hasClassName("downmodded")){
      val = action == "upmod" ? 2 : 1
    }else{
      val = action == "upmod" ? 1 : -1
    }
    itemNode.removeClassName(action == "upmod" ? "downmodded" : "upmodded");
    itemNode.toggleClassName(action + "ded");
    var pointsNode = itemNode.down(".points");
    var points = parseInt(pointsNode.innerHTML) + val;
    pointsNode.innerHTML = points  + " point" + (Math.abs(points) == 1 ? '' : 's');
    return false;
  }
}
function clicker(el){
  el.onclick = function(){
   var id = el.id.match(/(\d+)$/)[1];
   new Ajax.Request("/clicks", {parameters: {'click[item_id]': id, 'authenticity_token':FAT}});
  }
}
function dontClickMarklet(el){
  el.onclick = function(e){
    alert("Drag this link to your bookmarks or favorites bar to install");
    return false;
  }.bindAsEventListener(el);
}
var design_radios = [];
function updateSelectedDesign(el){
  var inp = el.down("input")
  var li = el.up("li");
  design_radios.push([el, inp]);
  inp.onclick = function(){
    design_radios.each(function(elem_inp){
      elem_inp[0][elem_inp[1].checked ? "addClassName" : "removeClassName"]("selected")
    });
    li.select('img').each(Element.hide);
    li.down("#design_preview_thumb_" + inp.value).show();
  };
}
function showDesignPreview(el){
  el.onclick = function(){
    window.open(el.href, 'slinksetDesignPreview', 'width=900,height=600');
    return false;
  }.bindAsEventListener();
}
function tryIt(el){
  var url_input = $("item_url");
  el.onclick = function(e){
    var val = url_input.value;
    if(val.strip().length > 0){
      if(!val.match(/^https?:\/\//)){
        val = "http://" + val;
      }
      el.href = val;
    }else{
      alert("No URL entered.");
      return false;
    }
  }.bindAsEventListener();
}
function autoSubmitOnEvent(ev_name){
  return function(el){
    el["on" + ev_name] = function(){
      el.up("form").submit();
    }
  }
}
function dullUntilInput(password){
  return function(el){
    el.onfocus = el.onkeydown = function(){
      el.removeClassName("dulled");
      el.value = "";
      el.onfocus = el.onkeydown = null;
      if(password){
        el.removeClassName("dulled-password");
        var passInput = el.cloneNode(false);
        passInput.type='password';
        el.parentNode.replaceChild(passInput, el);
        (function(){passInput.focus()}).defer();
        return false;
      }
    }.bindAsEventListener();
  }
}
function updatesPreview(elem){
  var preview = $(elem.id + "_preview");
  elem.observe('keyup', function(){
    preview.innerHTML = elem.value;
  });
}
function disableIfChecked(elem){
  var parent = elem.parentNode;
  var targId;
  elem.classNames().each(function(cn){
    var m;
    if(m = cn.match(/^disable-if-checked-(.*)$/)){
      targId = m[1];
    }
  });
  var targ = $(targId);
  if(targ){
    var enableIfChecked = function(){
      parent[targ.checked ? 'removeClassName' : 'addClassName']('disabled');
      elem.disabled = !targ.checked;
    }
    Event.observe(targ, 'click', enableIfChecked);
    enableIfChecked();
  }
}

function menuToggler(elem, togglersHolder, contentsHolder){
  if(typeof togglersHolder == 'number') togglersHolder = null;
  togglersHolder = togglersHolder || elem.down(".toggle-menu-menu");
  contentsHolder = contentsHolder || elem.down(".toggle-menu-contents")
  var togglers = togglersHolder.childElements();
  var contents = contentsHolder.childElements();
  var current = togglers.find(function(tog){tog.hasClassName("selected")});
  function show(tog){
    if(current == tog) return;
    togglers.each(function(tog2, idx){
      var classAction = tog==tog2 ? "addClassName" : "removeClassName"
      tog2[classAction]("selected");
      contents[idx][classAction]("selected");
    });
    current = tog;
  }
  togglers.each(function(tog){
    tog.observe('click', show.curry(tog));
  });
}
var selectorsAndActions = {
  ".comment-collapser": parentToggler("collapsed", ".comment"),
  ".reply-button": parentToggler("replying", ".comment-content"),
  ".mod-button": modder,
  ".item-link": clicker,
  ".bookmarklet": dontClickMarklet,
  ".design-radio": updateSelectedDesign,
  ".design-preview-thumb": showDesignPreview,
  ".item-try-it": tryIt,
  ".autosubmit-on-change": autoSubmitOnEvent("change"),
  ".autosubmit-on-click": autoSubmitOnEvent("click"),
  ".role-edit-link": parentToggler("editing", ".role-cell"),
  ".role-cancel-link": parentToggler("editing", ".role-cell"),
  ".focus-on-load": Form.Element.focus,
  ".dulled": dullUntilInput(),
  ".dulled-password": dullUntilInput(true),
  ".expander": parentToggler("expanded", "fieldset"),
  ".updates-preview": updatesPreview,
  ".disable-if-checked": disableIfChecked,
  ".image-mode-toggle": parentToggler("in-url-mode", ".item-image-li"),
  ".toggle-menu": menuToggler
}
Event.observe(window, 'load', function(){
  $H(selectorsAndActions).each(function(p){$$(p.key).each(p.value);});
});
