String.prototype.beginsWith  = function(t, i) { if (i==false) { return
(t == this.substring(0, t.length)); } else { return (t.toLowerCase()
== this.substring(0, t.length).toLowerCase()); } }

String.prototype.endsWith = function(t, i) { if (i==false) { return (t
== this.substring(this.length - t.length)); } else { return
(t.toLowerCase() == this.substring(this.length -
t.length).toLowerCase()); } }

// BEGIN /forum
function recnew() {
 if ($("#form_forumpost").length > 0) {
  Recaptcha.create("6LeSuwcAAAAAAKka-ufTHXpWnN_7cssDnrtS0mXc", $("#recaptcha"), {theme:'white'});
 }
}

$(function () {
 if ($("#form_forumpost").length > 0) {
  $("#form_forumpost input[name=user][value=yes]").click(function () {
   $("#forum_login").show();
   $("#forum_anon").hide();
  });
  $("#form_forumpost input[name=user][value=no]").click(function () {
   $("#forum_login").hide();
   $("#forum_anon").show();
  });
 }
 $("#form_forumpost").ajaxForm({
  dataType: 'text',
  beforeSubmit: function (formData, form, opts) {
   formData.push({ "name": "ajax", "value": "true" });
   formData.push({ "name": "recaptcha_challenge_field", "value": Recaptcha.get_challenge() });
   formData.push({ "name": "recaptcha_response_field", "value": Recaptcha.get_response() });
   var i;
   for (i = 1; i <= 8; i++) {
    $("#message_" + i).hide();
   }
   $("#form_postbutton").val("Please wait...");
   $("#form_postbutton").attr("disabled", "disabled");
  },
  success: function (dat, status) {
   if (dat == "0") window.location.reload(); // great success!
   if (dat == "7") window.location.reload(); // great success! token re-used
   else {
    if (dat.substring(0, 1) == "6") recnew();
    $("#message_" + dat).show();
    $("#form_postbutton").val("Write post");
    $("#form_postbutton").removeAttr("disabled");
   }
  }
 });
});
// END /forum



// BEGIN login
function gup( uri, name )
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( uri );
  if( results == null )
    return "";
  else
    return results[1];
}

$(function () {
 if (!($.browser.msie && $.browser.version=="6.0")) {
  $.expr[':'].login = function(obj){
     return obj.href && !obj.href.match(/^mailto\:/)
             && (obj.hostname == location.hostname)
             && (obj.href.match(/login\?return=/));
  };
  $(".jqmWindow").jqm();
  $("a:login").live("click", function () {
   $(".jqmWindow").jqm({ajax:"/users/login?ajax=y&return=" + gup(this.href, "return"),trigger: false, ajaxText: '<img src="/images/loading.gif" />', onHide: function (h) { if ($(".jqmWindow #noclose").length == 0) { h.w.hide(); h.o.remove(); } }});
   $(".jqmWindow").jqmShow();
   return false;
  });
 }
});
// END login



// BEGIN lightbox
$(function () {
 if ($("a[rel*='lightbox']").length > 0) {
  $("a[rel*='lightbox']").lightBox({
   imageLoading: '/images/loading.gif',
   imageBtnClose: '/images/closelabel.gif',
   imageBtnPrev: '/images/prevlabel.gif',
   imageBtnNext: '/images/nextlabel.gif'
  });
 }
});
// END lightbox



// BEGIN /room-database
$(function () {
 $("#room_db_checks input").click(function () {
  $(".r_bath").toggle($("#r_bath").is(":checked"));
  $(".r_set").toggle($("#r_set").is(":checked"));
  $(".r_photos").toggle($("#r_photos").is(":checked"));
  $(".r_shower").toggle($("#r_shower").is(":checked"));
 });
});
// END /room-database



// BEGIN /people
function registerBioForm() {
 $("#profile_whyNotPrivate").click(function () {
  $("#whyNotPrivate").show();
  return false;
 });
 $("#whyNotPrivate").hide();
 if ($("form#bio").length > 0) {
  $("form#bio").ajaxForm({
   success: function(dat, status) {
    $("#mainbody").html($("<div/>").append(dat.replace(/<script(.|\s)*?\/script>/g, "")).find("#mainbody").html());
    registerBioForm();
   }
  });
 }
 if ($("#namesearch").length > 0) {
  var reg = new RegExp("^[^:]*:[^:]*:");
  reg.compile(reg);
  $("#namesearch").autocomplete("/people/", {
   url: "/people/",
   extraParams: {ajax: "y"},
   minChars: 3,
   mustMatch: false,
   formatItem: function (row, i, n, term) {
    var f = row[0];
    var pieces = f.split(":", 2);
    var url = pieces[0];
    var name = pieces[1];
    var desc = f.replace(reg, "");
    return "<span class=\"name\">" + name + "</span><br />" + desc;
   },
   formatResult: function (row, i, n) {
    var f = row[0];
    var pieces = f.split(":", 2);
    return pieces[1];
   }
  });
  $("#namesearch").result(function (ev, item) {
   if (item == null) return;
   var f = item[0];
   var pieces = f.split(":", 1);
   window.location.href = "/people/" + pieces[0];
  });
 }
 $("input[name=ajax]").val("true");
}

$(function () {
 $("#profile_edit").click(function () {
  var d = this.href;
  $.ajax({
   url: d,
   success: function (dat, status) {
    $("#mainbody").html($("<div/>").append(dat.replace(/<script(.|\s)*?\/script>/g, "")).find("#mainbody").html());
    registerBioForm();
   },
   dataType: "html",
   error: function (a,b,c) {
    window.location.href = d;
   },
   timeout: 2000
  });
  return false;
 });
 registerBioForm();
});
// END /people



// BEGIN /booking
String.prototype.beginsWith = function(t, i) { if (i==false) { return
(t == this.substring(0, t.length)); } else { return (t.toLowerCase()
== this.substring(0, t.length).toLowerCase()); } }

String.prototype.endsWith = function(t, i) { if (i==false) { return (t
== this.substring(this.length - t.length)); } else { return
(t.toLowerCase() == this.substring(this.length -
t.length).toLowerCase()); } }

//this function returns the computed pixel value
//of 1em relative to the given element
function getComputedEm(el){
 var tdiv = document.createElement("div");
 tdiv.style.height = "1em";
 tdiv.style.position = "absolute";
 tdiv.style.backgroundColor = "#f00";
 el.appendChild(tdiv);
 var emValue = tdiv.offsetHeight;
 el.removeChild(tdiv);
 return emValue;
}

function registerBookingForm() {
 $("#bookingform").data("submitting", false);

 // -- SUBMISSION/VALIDATION HANDLER
 $("#bookingform").ajaxForm({
  beforeSubmit: function (data, form, opts) {
   $("#submitting").show();
   $("#bookingformwindow2 input[type=submit]").attr("disabled", "disabled");
   $("#bookingform").data("submitting", true);
   return true;
  },
  success: function(responseText) {
   $("#submitting").hide();
   $("#bookingform").data("submitting", false);
   $("#bookingformwindow2 input[type=submit]").removeAttr("disabled");
   $("#bookingform").find("input[name=password-forgot]").val("");
   var j = eval("(" + responseText + ")");
   if (j.success) {
    $.closeDOMWindow();
    processBookings(j.update);
    var sel = $("#booking .slot-selected");
    removeSelection();
    sel.css("backgroundColor", "#fac681");
    sel.animate({backgroundColor: "#FCFCFA"}, 1000, "linear", function () { $(this).css("backgroundColor", ""); } );
    $("#messages").next().andSelf().remove();
   } else {
    if ($("#messages").length == 0) {
     $("#bookingformwindow2 h3").after("<div id='messages'><p /></div><p />");
    }
    if (j.redirect != "") {
     location.href=j.redirect;
    } else if (j.message != "") {
     $("#messages p").text(j.message);
    }
    if (j.askpass) {
     $("#passwordrow").show();
    }
   }
  }
 });

 // -- DROPDOWN HANDLER
 $("#bookingform select[name=court]").change(function() {
  var t = $(this);
  var form = $("#bookingformwindow2");
  var sel = $(this).find("option:selected").text();
  var cell = $("#booking .slot-selected");
  form.find("#inputemail").toggle(sel.beginsWith("Book"));
  //form.find("#inputremind").toggle(sel.beginsWith("Book"));
  form.find("#inputremind").hide();
  form.find("#emailrow").toggle(sel.beginsWith("Cancel"));
  form.find("#passwordrow").hide();
  form.find("input[name=password]").val("");
  form.find("form").attr("action", (sel.beginsWith("Book")) ? "/booking/?action=book" : "/booking/?action=cancel");
  form.find("input[type=submit]").attr("value", (sel.beginsWith("Book")) ? "Book" : "Cancel");
  form.find("input[type=submit]").toggle(sel != "");
  if (sel.beginsWith("Cancel")) {
   $("#bookingform").find("input[name=password-forgot]").val("");
   var court = t.val();
   form.find("#emailrow td").eq(1).text(cell.data("c" + court).email);
   form.find("input[name=cancelemail]").val(cell.data("c" + court).email);
   form.find("input[name=password-register]").val((cell.data("c" + court).passworded == 0) ? "y" : "");
  }
 });

 $("#forgotpassword").click(function () {
  $("#bookingform").find("input[name=password-forgot]").val("y");
  $("#bookingform").submit();
  return false;
 });
}

function removeSelection() {
 $.closeDOMWindow();
 $("#booking .slot-selected").removeClass("slot-selected");
 $("#booking .below-selected").removeClass("below-selected");
 $("#booking .rightof-selected").removeClass("rightof-selected");
}

$(function () {
 if ($("#booking").length > 0) {
  hts = {onAfter: function () {
   $("#prevweek").toggle(week == 3);
   $("#nextweek").toggle(week == 0);
  }};
  anim = RegExp(" AppleWebKit/").test(navigator.userAgent) ? 0 : 100;
  anim *= RegExp("MSIE").test(navigator.userAgent) ? 0 : 1;
  anim *= RegExp("Opera").test(navigator.userAgent) ? 0 : 1;
   // as of 2009-10-30, Chrome and Safari mess up scrolling
   // and IE too!
   // also Opera... something really wrong here

  $("#bookingformwindow").show();
  formwidth = $("#bookingformwindow").width();
  em = getComputedEm($("#bookingform")[0]);
  $("#bookingformwindow").hide();
  registerBookingForm();
  // prevent text selection (usually accidental)
  $("#booking .slot").bind("mousedown", function () { return false; });
  $("#booking .slot").bind("selectstart", function () { return false; });

  // -- CELL CLICK HANDLER
  $("#booking .slot").click(function () {
   var cell = $(this);
   var alreadyHere = cell.hasClass("slot-selected");
   if ($("#bookingform").data("submitting")) return;
   removeSelection(false);
   if (cell.data("past")) return;
   if (alreadyHere) return;
   cell.addClass("slot-selected");
   cell.parents("tr").next().children().eq(cell.prevAll().length).addClass("below-selected");
   cell.next().addClass("rightof-selected");
   var hour = cell.parents("tr").data("hour");
   var date = new Date(cell.parents("table").find("th").eq(cell.parent().children().index(this)).data("date").valueOf());
   // FORM PREPARATION
   $("#bookingformwindow2 h3").text(cell.parents("tr").find(".hour .display").text() + " " + cell.parents("table").find("th").eq(cell.parent().children().index(this)).find(".display-ox").text());
   $("#messages").next().andSelf().remove();
   $("#submitting").hide();
   $("#bookingformwindow2 input[type=submit]").removeAttr("disabled");
   $("#bookingformwindow2 input[name=hour]").val(hour);
   $("#bookingformwindow2 input[name=date]").val(date.getTime()/1000);
   $("#bookingformwindow2 select[name=remind] option").attr("disabled", function (i) {
    if ($(this).val() == "") return "";
    var remindat = new Date(date.getTime());
    remindat.setHours($(this).val());
    return (remindat >= new Date()) ? "" : "disabled";
   });
   if (!$("#bookingformwindow2 select[name=remind] option:enabled").is(":selected")) {
    $("#bookingformwindow2 select[name=remind] option:enabled").eq(0).attr("selected", "selected");
   }
   $("#bookingformwindow2 select[name=court] option").attr("disabled", function (i) {
    if (i == 0) return "";
    if (cell.find("span").length == 0) { // all free
     return "";
    }
    if (cell.find("span").eq(i-1).text() == "free") {
     return "";
    }
    return "disabled";
   });
   if ($("#bookingformwindow2 select[name=court] option:enabled").length > 1) {
    $("#bookingformwindow2 select[name=court] option:enabled").eq(1).attr("selected", "selected");
   } else {
    $("#bookingformwindow2 select[name=court] option:enabled").eq(0).attr("selected", "selected");
   }
   $("#bookingformwindow2 select[name=court] option").each(function (i) {
    if (i == 0) return;
    if (cell.data("blank") || (cell.find("span").eq(i-1).text() == "free")) {
     $(this).text("Book court " + i);
    } else {
     $(this).text("Cancel court " + i);
    }
    $(this).removeAttr("disabled");
   });
   $("#bookingformwindow2 select[name=court]").change();
   $.openDOMWindow({
    windowSourceID: "#bookingformwindow",
    width: formwidth,
    overlay: 0,
    positionType: "absolute",
    windowPadding: "0em 1em",
    windowBgColor: "#ECE9D8", // why doesn't this work?
    borderColor: "#000",
    borderSize: 2,
    positionLeft: Math.min(cell.offset().left - 1, cell.parents("table").offset().left + cell.parents("table").width() - formwidth - 2*em - 2*2 - 2),
    positionTop: cell.offset().top + cell.outerHeight() - document.body.parentNode.scrollTop - 1,
    anchoredSelector: this
   });
   $("#DOMWindow").css("height", "");
   $("#DOMWindow").css("background-color", "#ECE9D8");
  });
  $("#prevweek").hide();
  week = 0;
  $("#prevweek button").click(function () {
   removeSelection();
   week = 0;
   $("#bookingscroll").scrollTo($("#booking li").eq(week), 5*anim, hts);
  });
  $("#nextweek button").click(function () {
   removeSelection();
   week = 3;
   $("#bookingscroll").scrollTo($("#booking li").eq(week), 5*anim, hts);
  });
  $(window).resize(function () {
   $("#bookingscroll").scrollTo($("#booking li").eq(week), 2*anim, hts);
  });
  $("#booking table").each(function () {
   $(this).find("th .value").each(function (i) {
    $(this).parent().data("date", new Date($(this).text()*1000));
    $(this).parent().data("index", i);
   });
  });
  $("#booking td .value").each(function () {
   $(this).parents("tr").data("hour", parseInt($(this).text()));
  });
  processBookings(eval($("#booking-data").text()));
 }
});

function processBookings(bookings) {
 // the only one to update the screen often enough is Opera! lulz
 $("#booking").hide();
 $("#loading2").show(); // only necessary when reprocessing
 $("#booking-data").hide();
 var now = new Date();
 $("#booking td.slot").each(function (i) {
  var hour = $(this).parents("tr").data("hour");
  var date = new Date($(this).parents("table").find("th").eq($(this).parent().children().index(this)).data("date").valueOf());
  date.setHours(hour+1,0,0);
  $(this).data("past", date < now);
  $(this).html("<strong>Court 1</strong>: <span>free</span>");
  $(this).append("<br />");
  $(this).append("<strong>Court 2</strong>: <span>free</span>");
  $(this).data("blank", true);
  $(this).removeData("c1");
  $(this).removeData("c2");
 });
 $.each(bookings, function() {
  var d = new Date(this.datetime*1000);
  var f = $("#booking th .value").parent().filter(function() { return $(this).data("date").getDate() == d.getDate(); });
  var l = f.parents("table").find("tr").filter(function() { return $(this).data("hour") == d.getHours(); }).children().eq(f.data("index")+1);
  l.find("span").eq(this.room-1).text(this.name);
  l.data("blank", false);
  l.data("c" + this.room, this);
 });
 $("#booking td.slot").each(function (i) {
  if ($(this).data("blank") || $(this).data("past")) {
   $(this).addClass("free-slot");
   if ($(this).data("blank")) {
    $(this).html("&nbsp;");
   }
  } else {
   $(this).removeClass("free-slot");
  }
  if (!$(this).data("past")) {
   $(this).addClass("future-slot");
  } else {
   $(this).removeClass("future-slot");
  }
 });
 $("#booking").show();
 $("#bookingscroll").scrollTo($("#booking li").eq(week), hts);
 $("#loading2").hide();
}
// END /booking
