//
// Event Sifter
//
// Copyright (c) Fandle Technology 2010
//

function filterdate() {
    startDay = 0;
    endDay = 62;
    updateslider();
}

function updateslider() {
    dates.filter(".sliderbg").removeClass("sliderbg");
    dates.filter(".sliderstart").removeClass("sliderstart");
    dates.filter(".sliderend").removeClass("sliderend");
    dates.slice(startFilter-1,startFilter).addClass("sliderstart");
    dates.slice(endFilter-1,endFilter).addClass("sliderend");
    dates.slice(startFilter,endFilter-1).addClass("sliderbg");

    var newStart = startFilter;
    var newEnd = endFilter;
    if (newStart < startDay) {
	for (var n = newStart; n < startDay; n++) {
	    $(".eventList tr.day" + n).show();
	}
    } else if (newStart > startDay) {
	for (var n = startDay; n < newStart; n++) {
	    $(".eventList tr.day" + n).hide();
	}
    }
    if (newEnd < endDay) {
	for (var n = endDay; n > newEnd; n--) {
	    $(".eventList tr.day" + n).hide();
	}
    } else if (newEnd > endDay) {
	for (var n = newEnd; n > endDay; n--) {
	    $(".eventList tr.day" + n).show();
	}
    }

    startDay = newStart;
    endDay = newEnd;
}

function hidepanel(e) {
    $("#" + e.target.id + "panel").hide();
    $("#" + e.target.id).html("[+]");
}

function showpanel(e) {
    $("#" + e.target.id + "panel").show();
    $("#" + e.target.id).html("[-]");
}

function logobj(o) {
    if (window.console) {
	for (p in o) {
	    if (p == 'selectionStart') { continue; }
	    if (p == 'selectionEnd') { continue; }
	    console.log(p + ": " + o[p]);
	}
    }
}

function log() {
    if (window.console) {
	var msg = "";
	for (var i=0; i<arguments.length; i++) {
	    msg += arguments[i] + " ";
	}
	console.log(msg);
    }
}

function filterartist(e) {
    var artistid = $(this).parent().parent().attr("id");
    if (e.target.checked) {
	$(".eventList tr." + artistid).show();
	filterdate();
    } else {
	$(".eventList tr." + artistid).hide();
    }
}

var artistsselected = {};

function onlyartist(e) {
    var clickedid = $(this).parent().attr("id");
    showonlyartistid(clickedid);
}

function showonlyartistid(id) {
    log("Showing only",id);
    $("table.artists :checkbox").each(function() {
	var $this = $(this);
	var artistid = $this.parent().parent()[0].id;
	if (artistid != id) {
	    $this.removeAttr("checked");
	    $(".eventList tr." + artistid).hide();
	}
    });
    $(".eventList tr." + id).show();
    filterdate();
}

function allartists(e) {
    $("table.artists :checkbox").each(function() {
	var $this = $(this);
	var artistid = $this.parent().parent()[0].id;
	$this.attr("checked","checked");
	$(".eventList tr." + artistid).show();
    });
    filterdate();
}

function createArtists() {
    var names = {};
    $(".eventList tr:visible").each(function(i) {
	var $this = $(this);
	var pattern = /artist\d+/g;
	var match = null;
	var trclass = $this.attr("class");
	while (match = pattern.exec(trclass)) {
	    var artistid = match[0];
	    var artistname = artists[artistid];
	    names[artistname] = artistid;
	}
    });
    var html = "";
    var keynames = keys(names).sort();
    for (var i = 0; i < keynames.length; i++) {
	var artistname = keynames[i];
	var artistid = names[artistname];
	var abbr = artistname.length < 23 ? artistname : artistname.substring(0,22) + "...";
	html += "<tr id=\"" + artistid + "\">";
	html += "<td>";
	html += "<input type=\"checkbox\" checked=\"checked\">";
	html += "</td>";
	html += "<td title=\"Show ONLY " + artistname + "\" class=\"artisttoggle\">";
	html += abbr;
	html += "</td>";
	html += "</tr>";
    }
    $("table.artists").html(html);
    $("table.artists input").click(filterartist);
    $(".artisttoggle").toggle(onlyartist,allartists);
}

function createTags() {
    var names = {};
    $(".eventList tr:visible").each(function(i) {
	var $this = $(this);
	var pattern = /tag_(\w+)/g;
	var match = null;
	var trclass = $this.attr("class");
	while (match = pattern.exec(trclass)) {
	    names[match[1]] = 1;
	}
    });
    var html = "";
    var keynames = keys(names).sort();
    for (var i = 0; i < keynames.length; i++) {
	var tagname = keynames[i];
	html += "<tr id=\"" + tagname + "\">";
	html += "<td>";
	html += "<input type=\"checkbox\" checked=\"checked\">";
	html += "</td>";
	html += "<td title=\"Show ONLY " + tagname + "\" class=\"tagtoggle\">";
	html += tagname;
	html += "</td>";
	html += "</tr>";
    }
    $("table.tags").html(html);
    $("table.tags input").click(filtertag);
    $(".tagtoggle").toggle(onlytag,alltags);
}

function filtertag(e)
{
    var tagname = $(this).parent().parent().attr("id");
    if (e.target.checked) {
	$(".eventList tr.tag_" + tagname).show();
	filterdate();
    } else {
	$(".eventList tr.tag_" + tagname).hide();
    }
}

function onlytag(e)
{
    var id = $(this).parent().attr("id");
    log("Showing only",id);
    $("table.tags :checkbox").each(function() {
	var $this = $(this);
	var tagname = $this.parent().parent()[0].id;
	if (tagname != id) {
	    $this.removeAttr("checked");
	    $(".eventList tr.tag_" + tagname).hide();
	}
    });
    $(".eventList tr.tag_" + id).show();
    filterdate();
}

function alltags(e)
{
    $("table.tags :checkbox").each(function() {
	var $this = $(this);
	var tagname = $this.parent().parent()[0].id;
	$this.attr("checked","checked");
	$(".eventList tr.tag_" + tagname).show();
    });
    filterdate();
}

function keys(map) {
    var names = [];
    for (key in map) names.push(key);
    return names;
}

function sessionChange(response) {
    if (response.session) { // user logged in
	log("sessionChange: logged in");
	$("#authlabel").html("Signed in as: ");
	setUsername();
    } else { // user logged out
	log("sessionChange: logged out");
	$("#authlabel").html("Sign in with: ");
	$("#authvalue").html("<a class=\"fb_button fb_button_medium\"><span class=\"fb_button_text\">Login</span></a>")
	               .bind('click', login);
    }
}

function setUsername() {
    log("Setting username...");
    FB.api('/me', function(response) {
	log("from ", response);
	$("#authvalue").html(response.first_name + " " + response.last_name
			     + ' <a href="javascript:logout()">sign out</a>')
	               .unbind('click',login);
    });
}

function login() {
    FB.login(function (response) {
	log("login");
    });
}

function logout() {
    FB.logout(function (response) {
	log("logging out");
    });
}

function loginStatus(response) {
    if (response.session) {
	setUsername();
    } else {
	log("cookie, but not logged in");
	$("#authvalue").bind('click', login);
    }
}

function savetags() {
    var form = $("#tagsform");
    log("posting to",form.attr('action'));
    $.post(form.attr('action'), form.serialize(), function(data) {
	$("#tagnames").html(data);
    });
    $("#editTags").hide();
    $("#displayTags").show();
    return false;
}

function edittags() {
    $("#displayTags").hide();
    $("#editTags").show();
    var inputText = $("#tagtext")[0];
    setCaretToPos(inputText, inputText.value.length);
    $("#updatebutton").click(savetags);
}

function eviestatus() {
    var iframe = $("#eviestatus");
    var url = $("#url").attr("value");
    iframe.attr("src", url + "status");
    iframe.attr("height",50);
}

function sift() {
    var tags = $("#tags").val().replace(/\s+/g," ").split(" ").sort().join("/");
    var url = window.location.href;
    url = url.replace(/\/[^\/]*$/,"") + "/sift/"
	+ tags + "#from="
	+ $("#from").val().replace(/ /g,"+") + "&until="
	+ $("#to").val().replace(/ /g,"+");
    window.location.href = url;
    return false;
}

function setSelectionRange(input, selectionStart, selectionEnd) {
  if (input.setSelectionRange) {
    input.focus();
    input.setSelectionRange(selectionStart, selectionEnd);
  }
  else if (input.createTextRange) {
    var range = input.createTextRange();
    range.collapse(true);
    range.moveEnd('character', selectionEnd);
    range.moveStart('character', selectionStart);
    range.select();
  }
}

function setCaretToPos (input, pos) {
  setSelectionRange(input, pos, pos);
}

function parseDate(d) {
    if (!d.match(/[0-9][0-9][0-9][0-9]/)) {
	d = d + " " + new Date().getYear();
    }
    return new Date(d);
}

function getDayOfYear(d) {
    d = parseDate(d);
    var days = 0;
    var month = d.getMonth();
    if (month > 0) days += 31;
    if (month > 1) days += 28;
    if (d.getFullYear() % 4 == 0 && d.getFullYear() % 100 != 0) days += 1;
    if (month > 2) days += 31;
    if (month > 3) days += 30;
    if (month > 4) days += 31;
    if (month > 5) days += 30;
    if (month > 6) days += 31;
    if (month > 7) days += 31;
    if (month > 8) days += 30;
    if (month > 9) days += 31;
    if (month > 10) days += 30;
    return days + d.getDate();
}

function initEmailAddress() {
    var ea = "info" + String.fromCharCode(64) + "fandle.com";
    $("#email").attr("href","mailto:" + ea);
}

function initFilterControls() {
    window.startDay = 1;
    window.endDay = 60;
    window.startFilter = startDay;
    window.endFilter = endDay;
    if (! window.artists) { artists = {}; }
    if (window.location.hash) {
	$.each(window.location.hash.substring(1).split("&"), function (k, v) {
	    if (v.match(/.+=.+/)) {
		log("Checking item",v);
		var param = v.split("=");
		log("  checking key",param[0]);
		log("  checking value",param[1]);
		var day = param[1].replace("+"," ");
		day = getDayOfYear(day) - getDayOfYear(window.day1)
		    + 1;
		if (day < 0) day += 365;
		if (param[0] == "from") startFilter = day;
		if (param[0] == "until") endFilter = day;
	    }
	});
    }
    log("startFilter",startFilter);
    log("endFilter",endFilter);

    $(".paneltoggle").toggle(hidepanel,showpanel);
    initDateHandlers();
    createArtists();
    createTags();
    if (window.selectedArtistID) { showonlyartistid(selectedArtistID); }
}

function initDateHandlers() {
    window.dates = $(".cal-slider .week .date");
    var dragging = 0;
    var lastclick = 0;
    filterdate();
    dates
	.click(function (e) {
	    var daynum = dates.index(this) + 1;
	    if (e.timeStamp-lastclick < 250) {
		endFilter = startFilter = daynum;
	    } else {
		lastclick = e.timeStamp;
		if (daynum > endFilter) endFilter = daynum;
		if (daynum < startFilter) startFilter = daynum;
	    }
	    updateslider();
	    createArtists();
	    createTags();
	})
	.mousedown(function (e) {
	    var daynum = dates.index(this) + 1;
	    if (daynum == startFilter) {
		dragging = -1;
	    } else if (daynum == endFilter) {
		dragging = 1;
	    }
	})
	.mouseup(function (e) {
	    dragging = 0;
	    createArtists();
	    createTags();
	})
	.mouseenter(function (e) {
	    var daynum = dates.index(this) + 1;
	    if (dragging) {
		if (dragging < 0) startFilter = daynum;
		if (dragging > 0) endFilter = daynum;
		if (endFilter < startFilter) {
		    dragging = dragging * -1;
		    daynum = startFilter;
		    startFilter = endFilter;
		    endFilter = daynum;
		}
		updateslider();
	    } else {
		if (daynum == startFilter ||
		    daynum == endFilter) {
		    dates.addClass("slidermove");
		}
	    }
	})
        .mouseleave(function (e) {
	    if (!dragging) dates.removeClass("slidermove");
	});
}

function initFacebook() {
    FB.init({appId: 145814072122715, status: true, cookie: true, xfbml: true});
    FB.Event.subscribe('auth.sessionChange', sessionChange);
    if ($.cookie('fbs_145814072122715')) {
	FB.getLoginStatus(loginStatus);
    } else {
	$("#authvalue").bind('click', login);
    }
}

function initSearch() {
    var today = new Date();
    var fromdate = today.getDate();
    $("#from").attr("value",getMMM(today.getMonth()) + " " + today.getDate());
    var days = 7 - today.getDay(); // days till Sunday
    var sunday = new Date(today.getTime() + (days * 24 * 60 * 60 * 1000));
    $("#to").attr("value",getMMM(sunday.getMonth()) + " " + sunday.getDate());
    showrange();
    var onFrom = 0;
    $("#tags").focus(function() {
	$("#tagsborder").addClass("tagfocus");
	$("#fromborder").removeClass("fromfocus");
	$("#toborder").removeClass("tofocus");
	$("#fromlabel").removeClass("fromfg");
	$("#tolabel").removeClass("untilfg");
    });
    $("#from").focus(function() {
	$("#fromborder").addClass("fromfocus");
	$("#toborder").removeClass("tofocus");
	$("#tagsborder").removeClass("tagfocus");
	onFrom = 1;
	$("#tolabel").removeClass("untilfg");
	$("#fromlabel").addClass("fromfg");
    });
    $("#to").focus(function() {
	$("#toborder").addClass("tofocus");
	$("#fromborder").removeClass("fromfocus");
	$("#tagsborder").removeClass("tagfocus");
	onFrom = 0;
	$("#fromlabel").removeClass("fromfg");
	$("#tolabel").addClass("untilfg");
    });
    setCaretToEnd("tags");
    $(".calendar .week .date")
	.click(function (e) {
	    var clazz = $(this).parent().parent().attr("class");
	    var mon = 11;
	    var match = clazz.match(/month-([0-9]+)/);
	    if (match) mon = match[1];
	    else log("No month found in class string:",clazz);
	    if (onFrom) {
		$("#from").attr("value",getMMM(mon) + " " +e.target.innerHTML);
		showrange();
		setCaretToEnd("to");
		onFrom = 0;
	    } else {
		$("#to").attr("value",getMMM(mon) + " " + e.target.innerHTML);
		showrange();
		setCaretToEnd("to");
	    }
	})
        .mouseenter(function (e) {
	    var $this = $(this);
	    if (!$this.hasClass("selected")) {
		if (onFrom) {
		    $this.addClass("frombg");
		} else {
		    $this.addClass("untilbg");
		}
	    }
	})
        .mouseleave(function (e) {
	    var $this = $(this);
	    if (!$this.hasClass("selected")) {
		if (onFrom) {
		    $this.removeClass("frombg");
		} else {
		    $this.removeClass("untilbg");
		}
	    }
	})
}

function showrange() {
    var thismonth = $(".calendar").attr("class").match(/month-([0-9]+)/)[1];
    var fromindex = dateoffset(thismonth, $("#from").attr("value"));
    var toindex = dateoffset(thismonth, $("#to").attr("value"));
    var dates = $(".calendar .week .date");
    $(".calendar .frombg").removeClass("frombg selected");
    $(".calendar .untilbg").removeClass("untilbg selected");
    $(".calendar .betweenbg").removeClass("betweenbg");
    dates.slice(fromindex-1,fromindex).addClass("frombg selected");
    dates.slice(toindex-1,toindex).addClass("untilbg selected");
    dates.slice(fromindex,toindex-1).addClass("betweenbg");
}

function dateoffset(thismonth, datestr) {
    var d = parseDate(datestr);
    if (d.getMonth() == thismonth) return d.getDate();
    var lastday = $(".calendar").attr("class").match(/last-day-([0-9]+)/)[1];
    return d.getDate() + Number(lastday);
}

function initFilterResults() {
    var url = window.location.pathname.replace(/^\//,"/results_");
    // Use query string "?test" to test the "Loading..." page
    if (window.location.search != "?test") {
	$("#results").load(url, function() {
	    $("#loading").hide();
	    initFilterControls();
	});
    }
}

function getMMM(monthNum) {
    return ["Jan", "Feb", "Mar", "Apr", "May", "Jun",
	    "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"][monthNum];
}

function setSelectionRange(input, selectionStart, selectionEnd) {
  if (input.setSelectionRange) {
    input.focus();
    input.setSelectionRange(selectionStart, selectionEnd);
  }
  else if (input.createTextRange) {
    var range = input.createTextRange();
    range.collapse(true);
    range.moveEnd('character', selectionEnd);
    range.moveStart('character', selectionStart);
    range.select();
  }
}

function setCaretToEnd (id) {
    var input = document.getElementById(id);
    var pos = input.value.length;
    setSelectionRange(input, pos, pos);
}

$(document).ready(function() {
    initFacebook();
    initEmailAddress();
    if ($("#from").length) {
	initSearch();
    }
    if ($("#results").length) {
	initFilterResults();
    }
});

