﻿ var GrafiskHus = new Object();
GrafiskHus.JavaScript = new Object();

GrafiskHus.JavaScript.GenericAjaxPoster = function(pageId, blnNew)
{
	this.CallbackHandler = null;
	var values = new Array();
	var callBackArgs = new Array();
	   
	this.RegisterValue = function(name, val)
	{
		var val = new GrafiskHus.JavaScript.GenericAjaxPoster.PostValue(name, val);
		values.push(val);
	}

	this.RegisterArgument = function(arg)
	{
		callBackArgs.push(arg);
	}

	this.Post = function(poster, recId, listId)
	{
		var url = location.protocol + "//" + location.host + "/page" + pageId + ".aspx?";
			if(blnNew)
			  url += "validating=1&action142=send";
			else
			  url += "action=post&layoutid=1";

			url += "&rndkey=" + Math.random(100);
    
		if(recId != null && listId != null) url += "&listid=" + listId + "&recid=" + recId;

		var params = "";

		for(var i = 0; i < values.length; i++)
		{
			if(params != "") params += "&";
			params += values[i].Name + "=" + encodeURIComponent(values[i].Value);
		}

		var storage = tsAjax.createInstance("bgsave");
		storage.method = "post";
		storage.postData = params + "&previouscontent=";
		storage.Poster = poster;
		storage.CallbackArguments = callBackArgs;
		if(this.CallbackHandler != null) storage.callbackHandler = this.CallbackHandler;

		if(this.CallbackHandler != null) tsAjax.innerHTML(url,"tsAjax","bgsave",null,null,this.GenericCallbackHandler);
		else return tsAjax.innerHTML(url,null,"bgsave",null,null,null);
	}

	this.GenericCallbackHandler = function()
	{
		if (this.ajaxObj!=null) {
			if (this.ajaxObj.readyState==4) {
				var RT = this.ajaxObj.responseText;
				var poster = this.Poster;

				this.callbackHandler.call(poster, RT, this.CallbackArguments);
											
				if (this.statusElement!=null) {this.statusElement.innerHTML = this.statusText_Done;}
				if (this.resultElement!=null) {this.resultElement.innerHTML = RT}
			} else {
			
		}			
		} else {
			var RT = this.IF.innerHTML;
			if (this.statusElement!=null) {this.statusElement.innerHTML = this.statusText_Done;}
			if (this.resultElement!=null) {this.resultElement.innerHTML = RT}
		}
	}
}
GrafiskHus.JavaScript.GenericAjaxPoster.PostValue = function(name, val)
{
  this.Name = name;
  this.Value = val;
}
GrafiskHus.JavaScript.GenericAjaxLoader = function(page)
{
	this.CallbackHandler = null;

	this.Load = function(sender)
	{
			var rnd = Math.random(10).toString().replace(".","");

		var url = location.protocol + "//" + location.host + "/" + page;
			if(page.indexOf("?") == -1) url += "?";
			else url += "&";
			url += "rndkey=" + rnd;
		

		var loader = tsAjax.createInstance(rnd);
		loader.method="get";
		loader.Sender = sender

		if(this.CallbackHandler != null) loader.callbackHandler = this.CallbackHandler;

		if(this.CallbackHandler != null) tsAjax.innerHTML(url,"tsAjax",rnd,null,null,this.GenericCallbackHandler);
		else return tsAjax.innerHTML(url,null,rnd,null,null,null);
	}

	this.GenericCallbackHandler = function()
	{
		if (this.ajaxObj!=null) {
			if (this.ajaxObj.readyState==4) {
				var RT = this.ajaxObj.responseText;

				this.callbackHandler.call(this.Sender,RT);
											
				if (this.statusElement!=null) {this.statusElement.innerHTML = this.statusText_Done;}
				if (this.resultElement!=null) {this.resultElement.innerHTML = RT}
			} else {
			
		}			
		} else {
			var RT = this.IF.innerHTML;
			if (this.statusElement!=null) {this.statusElement.innerHTML = this.statusText_Done;}
			if (this.resultElement!=null) {this.resultElement.innerHTML = RT}
		}
	}
}

GrafiskHus.JavaScript.TangoraPoster = function(pageId, containerId)
{
  this.Container = null;
  var _containerId = containerId;
  var _poster = null;

  this.OnPostSuccess = null;
  this.OnInit = null;

  this.Init = function()
  {
    this.Container = document.createElement("div");
    this.Container.id = _containerId;
    this.Container.innerHTML = "Henter indhold. Vent venligst...";
    this.Container.className = "hidden layer";
    $("body").append(this.Container);

    var loader = new GrafiskHus.JavaScript.GenericAjaxLoader("/page" + pageId + ".aspx");
    loader.CallbackHandler = this.InitDone;
    loader.Load(this);
  }

  this.InitDone = function(html)
  {
    this.Container.innerHTML = html;
    
    if(html.indexOf("form")==-1)
    {
	var arr = new Array();
	$.each($("#" + containerId + " input"), function(){
	  arr[this.id] = this.value;
	});
	this.OnPostSuccess(arr);
    }
    else
	if(this.OnInit != null) this.OnInit();

    var submit = $("input:submit", this.Container)[0];
    if(!submit) return;
    submit.poster = this;
    submit.onclick = this.SubmitClickHandler;

    
  }

  this.SubmitClickHandler = function()
  {
    var tp = new GrafiskHus.JavaScript.GenericAjaxPoster(pageId);
    tp.CallbackHandler = this.poster.InitDone;

    $.each($("#" + containerId + " input"), function(){
	if(this.type == "text")
	  tp.RegisterValue(this.name, this.value);
    });
    $.each($("#" + containerId + " select"), function(){
	  tp.RegisterValue(this.name, this.options[this.selectedIndex].value);
    });

    tp.Post(this.poster);

    return false;
  }
}
GrafiskHus.JavaScript.ToggleFormLayer = new function()
{
  this.Toggle = function(layer, slide)
  {
    var state = layer.css("display");

    if(state == "block")
	this.Hide(layer, slide);
    else
	this.Show(layer, slide);
  }
  this.Show = function(layer, slide)
  {
	if(slide)
	  layer.slideDown("fast");
	else
	  layer.css("display","block");

	$("input",layer).attr("disabled","");
  }
  this.Hide = function(layer, slide)
  {
	if(slide)
	  layer.slideUp("fast");
	else
	  layer.css("display","none");

	$("input",layer).attr("disabled","disabled");
  }
}
GrafiskHus.JavaScript.LoadCalendarEvents = function(start, end, lang)
{
  start = new Date(start);
  end = new Date(end);
  var startDate = start.getDate() + "-" + (parseInt(start.getMonth())+1) + "-" + start.getFullYear();
  var endDate = end.getDate() + "-" + (parseInt(end.getMonth())+1) + "-" + end.getFullYear();

  var events = "";
  if(lang == "uk")
    events = new GrafiskHus.JavaScript.GenericAjaxLoader("/page121.aspx?start=" + startDate + "&end=" + endDate).Load(null);
  else
    events = new GrafiskHus.JavaScript.GenericAjaxLoader("/page47.aspx?start=" + startDate + "&end=" + endDate).Load(null);
  
  var eventsArr = events.split("¤");

  var resultArr = new Array();

  for(var i = 0; i < eventsArr.length-1; i++)
  {
    var eventArr = eventsArr[i].split("$");

    var startDateArr = eventArr[2].split("-");
    var month = startDateArr[1];
    if(month.indexOf("0")==0)
	month = month.replace("0","");

    month = parseInt(month);
    var startDate = new Date(startDateArr[2],month-1,startDateArr[0]);

    var endDateArr = eventArr[3].split("-");
    var endDate = "";
    if(endDateArr.length > 1)
	endDate = endDateArr[2] + "-" + endDateArr[1] + "-" + endDateArr[0];

    resultArr.push({
	id: eventArr[0],
	title: eventArr[1],
	start: startDate,
	   end: endDate
    });
  }

  return resultArr;
}

GrafiskHus.JavaScript.ImageValidator = function(arguments)
{
  var _arguments = arguments;
  var _errorMsg = null;

  this.Init = function()
  {
    if(!_arguments.Field) return;
    
    _arguments.Field.onchange = this.OnchangeHandler;
    _arguments.Field.Validator = this;
    var container = _arguments.Field.parentNode;
    _errorMsg = document.createElement("div");
    _errorMsg.className = "hidden";
    _errorMsg.innerHTML = _arguments.ErrorMessage;
    container.appendChild(_errorMsg);
  }

  this.OnchangeHandler = function(e)
  {
    var img = document.createElement("img");
    $("body")[0].appendChild(img);
    img.onload = this.Validator.OnloadHandler;
    img.style.position = "absolute";
    img.style.top = "-1000px";
    img.style.left = "-1000px";
    img.src = this.value;
  }

  this.OnloadHandler = function(e)
  {
    if(_arguments.ValidateWidth)
    {
	if(_arguments.MinWidth > this.clientWidth)
	{
	  _arguments.SubmitButton.disabled = true;
	  $(_errorMsg).slideDown("fast");
	}
	else
	{
	  $(_errorMsg).hide();
	  _arguments.SubmitButton.disabled = false;
	}
    }
    if(_arguments.ValidateHeight)
    {
	if(_arguments.MinHeight > this.clientHeight)
	{
	  _arguments.SubmitButton.disabled = true;
	  $(_errorMsg).slideDown("fast");
	}
	else
	{
	  $(_errorMsg).hide();
	  _arguments.SubmitButton.disabled = false;
	}
    }
  }
}
GrafiskHus.JavaScript.GoogleMap = function(canvasId, locationString)
{
	this.MapCanvasId = canvasId;
	this.LocationString = locationString;
	this.MarkerText = "";
	var map = null;

	this.Init = function()
	{
		if (GBrowserIsCompatible())
		{
    			map = new GMap2(document.getElementById(this.MapCanvasId));
    			var gc = new GClientGeocoder();
			gc.getLatLng(this.LocationString, this.CallbackHandler);
    		}
	}

	this.CallbackHandler = function(point)
	{
     		var marker = new GMarker(point);
		marker.Text = this.MarkerText;
		map.addOverlay(marker);

		map.setCenter(point,13);
	}
}
GrafiskHus.JavaScript.InputLinkHelper = new function()
{
  this.Attach = function(strId)
  {
     var elm = document.getElementById(strId);

     Tangora.Events.AddHandler(elm, "onblur", GrafiskHus.JavaScript.InputLinkHelper.OnBlurHandler);
  }
  
  this.OnBlurHandler = function(e)
  {
    var elm = (this==window) ? window.event.srcElement : this;
    if(elm.value != "" && elm.value.indexOf("http://")==-1)
	elm.value = "http://" + elm.value;
  }
}
GrafiskHus.JavaScript.MarkLinks = new function()
{
  this.Write = function(container)
  {
    if(!container) return;

    var str = container.innerHTML;
    str = str.replace(/(http:\/\/\S+)/g, "<a href='$1' target='_blank' style='display:block;width:240px;overflow:hidden;text-overflow:ellipsis;'>$1</a>");
    if(str.indexOf("http")==-1)
    {
	str = str.replace(/(www\S+)/g, "<a href='http://$1' target='_blank' style='display:block;width:240px;overflow:hidden;text-overflow:ellipsis;'>$1</a>");
    }

    if(str.indexOf("@")>-1)
    {
	var strArr = str.split("@");
	var email = strArr[0].substring(strArr[0].lastIndexOf(" "));
	email += "@" + strArr[1].substring(0, strArr[1].indexOf(" "));
	
	str = str.replace(email, "<a href='mailto:" + email + "'>" + email + "</a>");
    }

    container.innerHTML = str;
  }
}
GrafiskHus.JavaScript.DefaultTexter = new function()
{
  this.Set = function(elmId, text)
  {
    var elm = document.getElementById(elmId);
    if(!elm) return;
    elm.defaultText = text;
    if(elm.value == "") elm.value = text;
    elm.onfocus = this.OnFocusHandler;
    elm.onblur = this.OnBlurHandler;
    elm.form.onsubmit = this.OnSubmitHandler; 
  }
  this.OnFocusHandler = function(e)
  {
    if(this.value == this.defaultText) this.value = "";
  }
  this.OnBlurHandler = function(e)
  {
    if(this.value == "") this.value = this.defaultText;
  }
  this.OnSubmitHandler = function(e)
  {
    var elms = this.getElementsByTagName("input");

    for(var i = 0; i < elms.length; i++)
    {
	if(elms[i].value == elms[i].defaultText) elms[i].value = "";
    }
  }
}
var Calendar = function (containerId)
{
    var _placeHolder = null;
    var _currentMonth = null;
    var _currentYear = null;

    this.Today = new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate());
    this.MonthNames = ["januar", "februar", "marts", "april", "maj", "juni", "juli", "august", "september", "oktober", "november", "december"];
    this.DayNames = ["Ma", "Ti", "On", "To", "Fr", "Lø", "Sø"];
    this.WeekLabel = "Uge";
    this.EventHandler = null;
    this.CalHelper = null;
    this.ShowWeekNumber = true;
    this.ShowDayNameForEachDate = false;
    this.ShowOverFlowDates = true;

    this.CurrentMonth = function ()
    { return _currentMonth; }

    this.CurrentYear = function ()
    { return _currentYear; }

    //Inits the calendar
    this.Init = function (displayMonth, displayYear)
    {
	  _placeHolder = document.getElementById(containerId);

	  if (!_currentMonth) {
		_currentMonth = (isNaN(displayMonth) || displayMonth == null) ? new Date().getMonth() : displayMonth - 1;
		_currentYear = (isNaN(displayYear) || displayYear == null) ? new Date().getFullYear() : displayYear;
	  }

	  this.CalHelper = new CalendarHelper(this.DayNames, this.MonthNames);

	  this.ExecuteEvents("init", this);

	  this.Render(displayMonth, displayYear);
    }

    //Renders the calendar
    this.Render = function ()
    {
	  this.ExecuteEvents("prerender", this);

	     var cont = document.createElement("div");

	  if (!this.ShowDayNameForEachDate) {
		var dayWrapper = document.createElement("div");
		dayWrapper.id = "header";
		cont.appendChild(dayWrapper);
	  }

	  if (this.ShowWeekNumber) {
		var dayHeader = document.createElement("div");
		dayHeader.className = "week";
		dayHeader.innerHTML = this.WeekLabel;
		dayWrapper.appendChild(dayHeader);
	  }

	  for (var i = 0; i < this.DayNames.length; i++) {
		dayHeader = document.createElement("div");
		dayHeader.id = "day_" + i;
		dayHeader.className = "day";
		dayHeader.innerHTML = this.DayNames[i];
		dayWrapper.appendChild(dayHeader);
	  }

	  var fb = document.createElement("div");
	  fb.className = "layoutfloatbreaker";
	  dayWrapper.appendChild(fb);

	  var weeks = this.CalHelper.GetNumberOfWeeks(_currentMonth, _currentYear);
	  var days = this.DayNames.length;
	  var firstDay = this.CalHelper.GetFirstDayOfMonth(_currentMonth, _currentYear);
	  var monthLength = this.CalHelper.GetMonthLength(_currentMonth, _currentYear);
	  var day = 1;
	  var week = this.CalHelper.GetWeekNumber(day, _currentMonth, _currentYear);

	  var daysWrapper = null;
	  var weekWrapper = null;

	  var j = 0;
	  if (firstDay == 0) j = -1;

	  var overFlowDate = 1;
	  for (j; j < weeks; j++) {
		daysWrapper = document.createElement("div");
		daysWrapper.className = "week_container";

		weekWrapper = document.createElement("div");
		weekWrapper.className = "week";
		weekWrapper.innerHTML = week;
		if (this.ShowWeekNumber) daysWrapper.appendChild(weekWrapper);
		week++;

		var dayWrapper = null;
		var d = null;
		var date = null;

		for (var x = 1; x <= days; x++) {
		    dayWrapper = document.createElement("div");
		    dayWrapper.className = "day";

		    if (x == 6 || x == 7) dayWrapper.className += " weekend";
		    if (x == 7) dayWrapper.className += " last";

		    if (day <= monthLength && (j > 0 || x >= firstDay) && (j > -1 || x == 7)) {
			  date = new Date(_currentYear, _currentMonth, day);

			  //Today?

			  if ((this.Today - date) == 0)
				dayWrapper.id = "today";

			  dayWrapper.Date = date;

			  //Events refer to date?
			  this.ExecuteEvents("predayrender", dayWrapper);

			  if (dayWrapper.innerHTML == "") {
				//If ShowDayNameForEachDate
				if (this.ShowDayNameForEachDate)
				    dayWrapper.innerHTML = "<span class=\"dayname\">" + this.DayNames[x - 1] + "</span>";

				dayWrapper.innerHTML += "<span class=\"date\">" + day + "</span>";
			  }

			  day++;
		    }
		    else if (day > monthLength) {
			  dayWrapper.innerHTML = overFlowDate;
			  overFlowDate++;
			  dayWrapper.className += " next_month";
		    }
		    else if ((j == -1 && x < 7) || (j == 0 && x < firstDay)) {
			  var ml = this.CalHelper.GetMonthLength((_currentMonth - 1), _currentYear);

			  dayWrapper.innerHTML = ml - firstDay + x + 1;
			  if (j == -1) dayWrapper.innerHTML = ml - 6 + x;
			  dayWrapper.className += " previous_month";
		    }

		    this.ExecuteEvents("dayrender", dayWrapper);

		    daysWrapper.appendChild(dayWrapper);
		}

		cont.appendChild(daysWrapper);
	  }

	  var fb = document.createElement("div");
	  fb.className = "layoutfloatbreaker";
	  cont.appendChild(fb);

	     _placeHolder.innerHTML = "";
	     _placeHolder.appendChild(cont);

	  this.ExecuteEvents("postrender", this);
    }

    this.Next = function () {
	  _currentMonth++;
	  if (_currentMonth > 11) {
		_currentMonth = 0;
		_currentYear++;
	  }

	  this.Render();
    }

    this.Previous = function () {
	  _currentMonth--;
	  if (_currentMonth < 0) {
		_currentMonth = 11;
		_currentYear--;
	  }

	  this.Render();
    }

    this.ExecuteEvents = function (event, sender) {
	  if (this.EventHandler != null)
		this.EventHandler.Execute(event, sender);
    }

}

var CalendarHelper = function (arrDayNames, arrMonthNames)
{
    this.GetMonthLength = function (monthIndex, year) {
	  var d = new Date(year, monthIndex + 1, 0);
	  return (d.getDate());
    }

    this.GetMonthName = function (monthIndex) {
	  return arrMonthNames[parseInt(monthIndex)];
    }

    this.GetDayName = function (dayIndex) {
	  return arrDayNames[dayIndex];
    }

    this.GetFirstDayOfMonth = function (monthIndex, year) {
	  var d = new Date(year, monthIndex, 1);
	  return (d.getDay());
    }

    this.GetNumberOfWeeks = function (monthIndex, year) {
	  var weeks = Math.ceil((this.GetMonthLength(monthIndex, year) + this.GetFirstDayOfMonth(monthIndex, year)) / 7);
	  return weeks;
    }

    this.GetWeekNumber = function (day, month, year) {
	  month = parseInt(month) + 1;
	  var a = Math.floor((14 - (month)) / 12);
	  var y = year + 4800 - a;
	  var m = (month) + (12 * a) - 3;
	  var jd = day + Math.floor(((153 * m) + 2) / 5) + (365 * y) + Math.floor(y / 4) - Math.floor(y / 100) + Math.floor(y / 400) - 32045;

	  var d4 = (jd + 31741 - (jd % 7)) % 146097 % 36524 % 1461;
	  var L = Math.floor(d4 / 1460);
	  var d1 = ((d4 - L) % 365) + L;
	  NumberOfWeek = Math.floor(d1 / 7) + 1;

	  return NumberOfWeek;
    }
}

var EventHandler = function () {
    var _eventHandlers = new Array();

    this.Register = function (evt) {
	  _eventHandlers.push(evt);
    }

    this.Execute = function (event, sender) {
	  for (var i = 0; i < _eventHandlers.length; i++) {
		if (_eventHandlers[i].Event == event)
		    _eventHandlers[i].Handler.call(sender);
	  }
    }
}

var Event = function (event, handler)
{
    this.Event = event;
    this.Handler = handler;
}

var CalendarEvent = function (id, start, end, name)
{
    this.Id = id;
    this.Start = start;
    this.End = end;
    this.Name = name;
}

var CalendarEvents = function ()
{
    var _events = new Array();
    var _that = this;
    var _callback = null;
  
    this.Init = function (start, end, callback)
    {
	   _callback = callback;
	var startDate = start.getDate() + "-" + (start.getMonth()+1) + "-" + start.getFullYear();
	var endDate = end.getDate() + "-" + (end.getMonth()+1) + "-" + end.getFullYear();

	var loader = new GrafiskHus.JavaScript.GenericAjaxLoader("/page47.aspx?check20_1=" + startDate + "&check20_2=" + endDate);
	   var events = loader.Load(null);

	   this.InitDone(events);
    }

    this.InitDone = function(events)
    {
	var eventsArr = events.split("¤");

	for(var i = 0; i < eventsArr.length-1; i++)
	{
	  var eventArr = eventsArr[i].split("$");

	  var startDateArr = eventArr[2].split("-");
	  var month = startDateArr[1];
	  if(month.indexOf("0")==0)
	  month = month.replace("0","");

	  month = parseInt(month);
	  var startDate = new Date(startDateArr[2],month-1,startDateArr[0]);

	  var endDateArr = eventArr[3].split("-");
	  var endDate = "";
	  if(endDateArr.length > 1)
	  endDate = endDateArr[2] + "-" + endDateArr[1] + "-" + endDateArr[0];

	  this.Register(eventArr[0], eventArr[2], eventArr[3], eventArr[1]);
	}

	 // _callback.call(this);
    }

    this.Register = function (id, start, end, name) {

	  var startArr = start.split("-");
	  start = new Date(startArr[2], (startArr[1]-1), startArr[0]);

	  if (end != null) {
		var endArr = end.split("-");
		end = new Date(endArr[2], (endArr[1]-1), endArr[0]);
	  }

	  _events.push(new CalendarEvent(id, start, end, name));
    }

    this.GetEvents = function (date) {
	  var found = new Array();

	  for (var i = 0; i < _events.length; i++) {
		if (((_events[i].Start - date) == 0) || (_events[i].Start <= date && _events[i].End >= date))
		    found.push(_events[i]);
	  }

	  return found;
    }
}
