/*global window */

if (window.console === undefined) {
    window.console = {
        log: function () {},
        group: function () {},
        error: function () {},
        warn: function () {},
        groupEnd: function () {}
    };
}
console.log("Testing console.log");

/*
 * ISO8601 date parse utility to combat silly IE 8.
 *
 */
function parseISO8601(str) {
    // we assume str is a UTC date ending in 'Z'
    var parts = str.split('T'),
	dateParts = parts[0].split('-'),
	_date = new Date();
    _date.setUTCFullYear(Number(dateParts[0]),
			 Number(dateParts[1]) - 1,
			 Number(dateParts[2]));
    // by using setUTC methods the date has already been converted to local time(?)
    return _date;
}


/*
 * Date Format 1.2.3
 * (c) 2007-2009 Steven Levithan <stevenlevithan.com>
 * MIT license
 *
 * Includes enhancements by Scott Trenda <scott.trenda.net>
 * and Kris Kowal <cixar.com/~kris.kowal/>
 *
 * Accepts a date, a mask, or a date and a mask.
 * Returns a formatted version of the given date.
 * The date defaults to the current date/time.
 * The mask defaults to dateFormat.masks.default.
 */

var dateFormat = function () {
	var	token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
		timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
		timezoneClip = /[^-+\dA-Z]/g,
		pad = function (val, len) {
			val = String(val);
			len = len || 2;
			while (val.length < len) val = "0" + val;
			return val;
		};

	// Regexes and supporting functions are cached through closure
	return function (date, mask, utc) {
		var dF = dateFormat;

		// You can't provide utc if you skip other args (use the "UTC:" mask prefix)
		if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !(/\d/).test(date)) {
			mask = date;
			date = undefined;
		}

		// Passing date through Date applies Date.parse, if necessary
		date = date ? new Date(date) : new Date;
		if (isNaN(date)) throw SyntaxError("invalid date");

		mask = String(dF.masks[mask] || mask || dF.masks["default"]);

		// Allow setting the utc argument via the mask
		if (mask.slice(0, 4) == "UTC:") {
			mask = mask.slice(4);
			utc = true;
		}

		var	_ = utc ? "getUTC" : "get",
			d = date[_ + "Date"](),
			D = date[_ + "Day"](),
			m = date[_ + "Month"](),
			y = date[_ + "FullYear"](),
			H = date[_ + "Hours"](),
			M = date[_ + "Minutes"](),
			s = date[_ + "Seconds"](),
			L = date[_ + "Milliseconds"](),
			o = utc ? 0 : date.getTimezoneOffset(),
			flags = {
				d:    d,
				dd:   pad(d),
				ddd:  dF.i18n.dayNames[D],
				dddd: dF.i18n.dayNames[D + 7],
				m:    m + 1,
				mm:   pad(m + 1),
				mmm:  dF.i18n.monthNames[m],
				mmmm: dF.i18n.monthNames[m + 12],
				yy:   String(y).slice(2),
				yyyy: y,
				h:    H % 12 || 12,
				hh:   pad(H % 12 || 12),
				H:    H,
				HH:   pad(H),
				M:    M,
				MM:   pad(M),
				s:    s,
				ss:   pad(s),
				l:    pad(L, 3),
				L:    pad(L > 99 ? Math.round(L / 10) : L),
				t:    H < 12 ? "a"  : "p",
				tt:   H < 12 ? "am" : "pm",
				T:    H < 12 ? "A"  : "P",
				TT:   H < 12 ? "AM" : "PM",
				Z:    utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
				o:    (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
				S:    ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
			};

		return mask.replace(token, function ($0) {
			return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
		});
	};
}();

// Some common format strings
dateFormat.masks = {
	"default":      "ddd mmm dd yyyy HH:MM:ss",
	shortDate:      "m/d/yy",
	mediumDate:     "mmm d, yyyy",
	longDate:       "mmmm d, yyyy",
	fullDate:       "dddd, mmmm d, yyyy",
	shortTime:      "h:MM TT",
	mediumTime:     "h:MM:ss TT",
	longTime:       "h:MM:ss TT Z",
	isoDate:        "yyyy-mm-dd",
	isoTime:        "HH:MM:ss",
	isoDateTime:    "yyyy-mm-dd'T'HH:MM:ss",
	isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
};

// Internationalization strings
dateFormat.i18n = {
	dayNames: [
		"Sø", "Ma", "Ti", "On", "Th", "Fr", "Lø",
		"Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag"
	],
	monthNames: [
		"jan", "feb", "mar", "apr", "mai", "jun", "jul", "aug", "sep", "okt", "nov", "des",
		"januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"
	]
};

// For convenience...
Date.prototype.format = function (mask, utc) {
	return dateFormat(this, mask, utc);
};

/* Production list filtering */

$(document).ready(function() {
  var filterKeys = ["lowestAgeGroup", "highestAgeGroup",
                    "osloFilter", "publicFilter", "genre", "search"],
      filter = {},
      searchTimer;

  var now = new Date();
  var now_title = now.format("d.mmmm yyyy");
  var now_date = now.format("yyyy-mm-dd");

  var tmp = new Date();
  tmp.setDate(1);
  var this_month = tmp.format("yyyy-mm-dd");
  tmp.setMonth(tmp.getMonth() + 1);
  var next_month = tmp.format("yyyy-mm-dd");
  tmp = new Date();
  tmp.setDate(1);
  if (tmp.getMonth() < 6) {
      tmp.setMonth(0);
  } else {
      tmp.setMonth(6);
  }
  var this_semester = tmp.format("yyyy-mm-dd");
  tmp.setMonth(tmp.getMonth() + 6);
  var next_semester = tmp.format("yyyy-mm-dd");
  tmp.setMonth(tmp.getMonth() + 6);
  var next_next_semester = tmp.format("yyyy-mm-dd");
  tmp.setMonth(tmp.getMonth() + 6);
  var next_next_next_semester = tmp.format("yyyy-mm-dd");

  console.log("this_month=", this_month, " next_month=", next_month, " this_semester=", this_semester, " next_semester=", next_semester, " next_next_semester=", next_next_semester, " next_next_next_semester=", next_next_next_semester);

  $("#dateFilter input.date").val(now_title);
  $("#dateFilter input[name='selecteddate']").val(now_date);

  function checkProduction(p) {
    var keep = true,
        text;

    if (filter.lowestAgeGroup && filter.highestAgeGroup &&
        (p.getAttribute('data-lowest-age-group') > filter.highestAgeGroup ||
        p.getAttribute('data-highest-age-group') < filter.lowestAgeGroup)) {
      keep = false;
    }

    if (filter.genre) {
      var pgenre = p.getAttribute("data-genre");
      if (pgenre !== filter.genre) {
	  var mgenre = pgenre.split(".")[0];
          if (mgenre !== filter.genre) {
	      keep = false;
	  }
      }
    }

    if (filter.county && p.getAttribute('data-counties')) {
	var counties = p.getAttribute('data-counties').split(" ");
	var found = false;
	$.each(counties, function() {
	   var id = this.split("/");
	   if (id[1] === filter.county) {
	       found = true;
	   }
	});
	if (!found) {
	  keep = false;
        }
    }

    if (filter.search) {
      text = p.getAttribute('data-text');
      $.each(filter.search.split(/[^a-z0-9àáäåæčçđéèêŋńñóòôöøšŧüž]/i), function() {
	 var pattern, token = this;
         token = token.replace(/a|à|á/g, "[aàá]");
         token = token.replace(/æ|ä/g, "[æä]");
         token = token.replace(/e|é|è|ê/g, "[eéèê]");
	 token = token.replace(/o|ó|ò|ô/g, "[oóòô]");
	 token = token.replace(/ø|ö/g, "[øö]");
	 token = token.replace(/u|ü/g, "[uü]");
	 pattern = new RegExp(token, "i");
         if (text.search(pattern) === -1) {
           keep = false;
	 }
      });
    }

    if (filter.osloFilter) {
      if (filter.osloFilter === "PROJECT" &&
          !(p.getAttribute("data-is-workshop") === "true" &&
	    p.getAttribute('data-lowest-age-group') >= 'TRINN01' &&
	    p.getAttribute('data-highest-age-group') <= 'TRINN10')) {
        keep = false;
      } else if (filter.osloFilter === "OPTIONAL" &&
                 p.getAttribute("data-state") !== "KANBESTILLES") {
        keep = false;
      } else if (filter.osloFilter === "FAST" &&
		 !(p.getAttribute('data-lowest-age-group') >= 'TRINN01' &&
		   p.getAttribute('data-highest-age-group') <= 'TRINN10' &&
                   p.getAttribute("data-is-workshop") !== "true" &&
                   p.getAttribute("data-state") !== "KANBESTILLES" )

		) {
        keep = false;
      } 
        else if (filter.osloFilter === "OSLOVGS" && 
        (p.getAttribute('data-lowest-age-group') > 'VG3' ||
         p.getAttribute('data-highest-age-group') < 'VG1' )) {
        keep = false;
      }
    }

    if (filter.publicFilter) {
      if (filter.publicFilter === "SCHOOL" &&
          p.getAttribute("data-isForSchool") !== "true" ) {
        keep = false;
      }
      if (filter.publicFilter === "PUBLIC" &&
          p.getAttribute("data-isForPublic") !== "true" ) {
        keep = false;
      }
    }

    if ( filter.dateFilter === 1 || filter.dateFilter === 2 ) {
      var fstart, fend;
      var dates = $.map($.trim(p.getAttribute("data-dates")).split(" "), function (pair) {
         var d = pair.split(",");
         if (d.length === 2) {
             return { start: d[0], end: d[1] };
	 } else {
	     return undefined;
	 }
      });
      if (dates.length === 0) {
	  keep = false;
      } else {
	  if ( filter.dateFilter === 1 && filter.dateCurrent ) {
              fstart = filter.dateCurrent;
              var d = parseISO8601(filter.dateCurrent);
	      d.setDate(d.getDate() + 1);
              fend = d.format("yyyy-mm-dd");
	  } else if (filter.datePeriod === "mnd") {
	      fstart = this_month;
              fend = next_month;
	  } else if (filter.datePeriod === "semester") {
              fstart = this_semester;
              fend = next_semester;
	  } else if (filter.datePeriod === "skoleaar") {
              fstart = this_semester;
              fend = next_next_semester;
	  } else if (filter.datePeriod === "neste-skoleaar") {
              fstart = next_semester;
              fend = next_next_next_semester;
	  }
	  // Note: gig date periods are inclusive, but filter periods are exclusive at the end (end date is the first date not to be included).
	  var overlap = false;
	  $.each(dates, function() {
		     if (!(fend <= this.start || fstart > this.end)) {
			 overlap = true;
		     }
		 });
	  if (!overlap) {
	      keep = false;
	  }
      }
    }

    return keep;
  }

    function deSerializeFilter(hash) {
      var filter = {};
      $.each(hash.split(","), function() {
        var kv = this.split("="),
            key = kv[0],
            value = unescape(kv[1]);

        if (key == "s") {
          filter.search = value;
        } else if (key == "fylke") {
          filter.county = value;
        } else if (key == "uttrykk") {
          filter.genre = value;
        } else if (key == "dato") {
          filter.dateFilter = 1;
          filter.dateCurrent = value;
        } else if (key == "idag") {
          filter.dateFilter = 1;
          filter.dateCurrent = now_date;
        } else if (key == "periode") {
          filter.dateFilter = 2;
          filter.datePeriod = value;
        } else if (this == "skoletilbud") {
          filter.publicFilter = "SCHOOL";
        } else if (this == "fast") {
          filter.osloFilter = "FAST";
        } else if (this == "valgfritt") {
          filter.osloFilter = "OPTIONAL";
        } else if (this == "prosjekt") {
          filter.osloFilter = "PROJECT";
        } else if (this == "oslovgs") {
          filter.osloFilter = "OSLOVGS";
        } else if (this == "offentlig") {
          filter.publicFilter = "PUBLIC";
        } else if (this.match("-")) {
          var ag = this.split("-");
          filter.lowestAgeGroup = ag[0].toUpperCase();
          filter.highestAgeGroup = ag[1].toUpperCase();
        }
      });
      return filter;
    }

    function serializeFilter(filter) {
      var data = [];
      if (filter.lowestAgeGroup) {
        data.push(filter.lowestAgeGroup.toLowerCase());
        data.push("-");
        data.push(filter.highestAgeGroup.toLowerCase());
        data.push(",");
      }
      if (filter.dateFilter === 1) {
        if (filter.dateCurrent) {
          data.push("dato=");
          data.push(filter.dateCurrent);
          data.push(",");
        }
      } else if ( filter.dateFilter === 2 ) {
        if (filter.datePeriod) {
          data.push("periode=");
          data.push(filter.datePeriod);
          data.push(",");
        }
      }
      if (filter.publicFilter === "SCHOOL") {
        data.push("skoletilbud");
        data.push(",");
      }
      if (filter.publicFilter === "PUBLIC") {
        data.push("offentlig");
        data.push(",");
      }
      if (filter.osloFilter === "FAST") {
        data.push("fast");
        data.push(",");
      }
      if (filter.osloFilter === "OPTIONAL") {
        data.push("valgfritt");
        data.push(",");
      }
      if (filter.osloFilter === "PROJECT") {
        data.push("prosjekt");
        data.push(",");
      }
      if (filter.osloFilter === "OSLOVGS") {
        data.push("oslovgs");
        data.push(",");
      }
      if (filter.genre) {
        data.push("uttrykk=");
        data.push(filter.genre);
        data.push(",");
      }
      if (filter.search) {
        data.push("s=");
        data.push(escape(filter.search));
        data.push(",");
      }
      if (filter.county) {
        data.push("fylke=");
        data.push(filter.county);
        data.push(",");
      }
      if (data.length > 0) {
        data.pop();
        return data.join("");
      } else {
        return " ";
      }
    }

    function doFilter() {
      console.log("Production filter is ", filter);
      var showing = 0;
      $(".programForSchool").show();
      $('#productions .production').each(function() {
        var keep = checkProduction($(this).parent()[0]);
        if (keep) {
          $(this).parent().removeClass("hide");
          showing++;
        } else {
          $(this).parent().addClass("hide");
        }
      });
      $("#tabs p.results span").html(showing);
      $(".programForSchool:not(:has(li:visible))").hide();
      window.location.hash = serializeFilter(filter);
    }

    $("[name='search']").keyup(function() {
        filter.search = this.value;
        clearTimeout(searchTimer);
        searchTimer = setTimeout(doFilter, 150);
    });

    $("[name='genre']").change(function() {
        filter.genre = this.value;
        doFilter();
    });

    $("[name='county']").change(function() {
        filter.county = this.value;
        doFilter();
    });

    $('.ageGroup :radio').click(function() {
        var ag = this.value.split(' ');
        filter.lowestAgeGroup = ag[0];
        filter.highestAgeGroup = ag[1];
        doFilter();
    });

    $('.osloAgeGroup :radio').click(function() {
        var ag = this.value.split(' ');
        filter.lowestAgeGroup = ag[0];
        filter.highestAgeGroup = ag[1];
        doFilter();
    });

    $('#osloFilter :radio').click(function() {
        filter.osloFilter = this.value;
        doFilter();
    });

    $("[name='isForSchool']").click(function() {
        filter.isForSchool = this.checked;
        doFilter();
    });

    $(".publicFilter :radio").click(function() {
        filter.publicFilter = this.value;
        doFilter();
    });

    //
    // Filter by day
    //
    $(".byDate .today").click(function() {
      // When user clicks on "today"
      var now = new Date();
      filter.dateFilter = 1;
      filter.dateCurrent = now.format("yyyy-mm-dd");
      filter.datePeriod = null;

      $("#dateFilter input.date").val(now.format("d.mmmm yyyy"));
       var chk = $(".byDate :radio").get(1);
      if ( !$(chk).attr("checked") ) {
        $(chk).attr("checked", "checked");
      }
      doFilter();
    });
    $(".byDate :radio").click(function() {
      // When user toggled date type
      var old = filter.dateFilter;
      filter.dateFilter = parseInt(this.value, 10);
      if ( filter.dateFilter == 1 ) {
        $(".byDate input[name='selecteddate']").change();
      } else if ( filter.dateFilter == 2 ) {
        $(".byDate select[name='period']").change();
      } else {
        if ( old != filter.dateFilter ) {
          filter.dateFilter = 0;
          filter.dateCurrent = null;
          filter.datePeroid = null;
          doFilter();
        }
      }
    });
    $(".byDate input[name='selecteddate']").change(function() {
      // When calendar change is triggered
      var chk = $(".byDate :radio").get(1);
      filter.dateFilter = 1;
      filter.datePeriod = null;
      filter.dateCurrent = $(".byDate input[type='hidden']").val();

      if ( !$(chk).attr("checked") ) {
        $(chk).attr("checked", "checked");
      }
      doFilter();
    });
    $(".byDate select[name='period']").change(function() {
      // When user changes period selection
      var chk = $(".byDate :radio").get(2);
      filter.dateFilter = 2;
      filter.datePeriod = this.value;
      filter.dateCurrent = null;

      if ( !$(chk).attr("checked") ) {
        $(chk).attr("checked", "checked");
      }
      doFilter();
    });
    $(".byDate select[name='period']").blur(function() {
      this.value = "";
    });
    $(".byDate .calendar").click(function() {
      // When user clicks the calendar link
      $(".byDate input.date").datepicker("show");
    });

    $(".byDate input.date").datepicker({
      "dateFormat" : "yy-mm-dd",
      showWeek: true,
      showButtonPanel : true,
      firstDay: 1,
      dayNamesMin: dateFormat.i18n.dayNames,
      monthNames:  dateFormat.i18n.monthNames.slice(12),
      weekHeader: '',
      closeText: 'Lukk',
      "onSelect" : function(dateText, inst) {
        var tmp = new Date(parseISO8601(dateText));
        $("#dateFilter input.date").val(tmp.format("d.mmmm yyyy"));
        $(".byDate input[name='selecteddate']").val(dateText);
        $(".byDate input[name='selecteddate']").change();
      }
    });

    function selectRadio(name, value) {
      $(":radio[name='" + name + "'][value='" + value + "']").
        attr("checked", "checked");
    }

    if (window.location.hash && ($(".program-page").length || $(".production-list-page").length)) {
      filter = deSerializeFilter(window.location.hash.substr(1));
      console.log("Parsed filter from hash: ", filter);

      $("[name='search']").val(filter.search);
      selectRadio("ageGroup", filter.lowestAgeGroup + " " + filter.highestAgeGroup);
      selectRadio("osloAgeGroup", filter.lowestAgeGroup + " " + filter.highestAgeGroup);
      $(".publicFilter :radio").removeAttr("checked");
      selectRadio("oslofilter", filter.osloFilter || "");
      selectRadio("publicFilter", filter.publicFilter || "");
      $("[name='genre']").val(filter.genre);
      $("[name='county']").val(filter.county);
      selectRadio("date", filter.dateFilter ? "" : 0);
      selectRadio("date", filter.dateFilter || "");
      selectRadio("date", filter.dateFilter || "");
      $("[name='period']").val(filter.datePeriod);
      if ( filter.dateCurrent ) {
        var tmp = parseISO8601(filter.dateCurrent);
        $(".byDate input[name='selecteddate']").val(filter.datePeriod);
        $("#dateFilter input.date").val(tmp.format("d.mmmm yyyy"));
      }
      doFilter();
    } else {
      selectRadio("date", filter.dateFilter ? "" : 0);
    }

    $("#content .section h2, #content .section .ribbon").bind("click", function() {
        $(this).parent().toggleClass("closed");
        return false;
    });
    $("#content .section:last .ribbon").click();

    // gallery
    $("#big-images img").each(function() {
        if ($(this).width() > $(this).height()) {
          $(this).addClass("landscape");
        } else {
          $(this).addClass("portrait");
        }
    });
    $("#gallery .thumbnails li.thumbnail").bind("click", function() {
        var id = this.id.substring(10);
        console.log("Switch image: ", id);
        $("#gallery .thumbnails li").removeClass("selected");
        $(this).addClass("selected");
        $("#big-images .picture").hide();
        $("#big-image-"+id).show();
    });
    $("#gallery .thumbnails li:first").click();

    function inst(url) {
      var m = url.match(/institusjon_\d+/);
      return m && m[0];
    }

    window.location.href.match(/institusjon_\d+/);
    if ($("#productionTab") &&
      $.cookie("productionName") &&
      inst(window.location.href) === inst($.cookie("productionHref")))
    {
      $("#productionTab a").attr("href", $.cookie("productionHref"));
      $("#productionTab span").text($.cookie("productionName"));
      $("#productionTab").removeAttr("id"); // show it
    }

    $('#resetFilterButton').attr("href", window.location.pathname);
 });

// production comments
$(document).ready(function() {
   var form = $('#addComment'),
       incomplete = $("#addComment .error-incomplete"),
       commentTooLong = $("#addComment .error-comment-too-long"),
       errorOnServer = $("#addComment .error-on-server");

   incomplete.hide();
   commentTooLong.hide();
   errorOnServer.hide();

   if (form) {
       $("#submitComment", form).click(function () {
           var data = form.serialize(),
               name = $.trim(form[0].name.value),
               school = $.trim(form[0].school.value),
               grade = $.trim(form[0].grade.value),
               comment = $.trim(form[0].comment.value);
           if (!(name && school && grade && comment)) {
	       incomplete.fadeIn(100);
	       return false;
	   }
           if (comment.length > 1000) {
	       commentTooLong.fadeIn(100);
	       return false;
	   }
           $('*', form).attr("disabled", true);
           $.ajax({
	      url: "/rb2/addProductionComment",
  	      type: "POST",
	      data: data,
              success: function(data) {
                 if (data === 'OK') {
		     window.location.hash = "kommentarer";
		     window.location.reload(true);
		 } else {
 	              errorOnServer.show();
  		      $('*', form).attr("disabled", false);
		 }
	      },
	      error: function() {
 	         errorOnServer.show();
		 $('*', form).attr("disabled", false);
	      }
           });
           return false;
       });
    }
});

// production comments
$(document).ready(function() {
  $("#debugbox").mouseover(function(e) {
    if (e.altKey && e.ctrlKey) {
	$("#debugbox").addClass("show");
    }
  });
});

function disableProgramTab() {
  $(document).ready(function() {
    var programTab =  $("a[href='program']");
    programTab.removeAttr("href");
    programTab.css("color", "#ddd");
    programTab.click(function () {
      alert("Programsiden på fylkesnivå krever dessverre en nyere nettleser.");
    });
  });
}

