/* Some JavaScript common to all pages */

// Wilma-palvelin ei tällä hetkellä osaa käsitellä UTF-8-koodattuja GET-parametreja, joten korvataan selaimen encodeURIComponent omalla
function encodeURIComponent(str) {
	return str.replace(/[^a-zA-Z0-9\-_.!~*]/g, function (substr) {
		var cc = substr.charCodeAt(0);
		if (cc === 32) {
			return '+';
		}
		if (cc > 255) {
			switch (cc) {
				case 8364: cc = 0x80; break;
				case 8218: cc = 0x82; break;
				case 402: cc = 0x83; break;
				case 8222: cc = 0x84; break;
				case 8230: cc = 0x85; break;
				case 8224: cc = 0x86; break;
				case 8225: cc = 0x87; break;
				case 710: cc = 0x88; break;
				case 8240: cc = 0x89; break;
				case 352: cc = 0x8A; break;
				case 8249: cc = 0x8B; break;
				case 338: cc = 0x8C; break;
				case 381: cc = 0x8E; break;
				case 8216: cc = 0x91; break;
				case 8217: cc = 0x92; break;
				case 8220: cc = 0x93; break;
				case 8221: cc = 0x94; break;
				case 8226: cc = 0x95; break;
				case 8211: cc = 0x96; break;
				case 8212: cc = 0x97; break;
				case 732: cc = 0x98; break;
				case 8482: cc = 0x99; break;
				case 353: cc = 0x9A; break;
				case 8250: cc = 0x9B; break;
				case 339: cc = 0x9C; break;
				case 382: cc = 0x9E; break;
				case 376: cc = 0x9F; break;
				case 160: cc = 0xA0; break;
				default: cc = 0;
			}
		}
		if (cc <= 0) {
			cc = 63;
		}
		return (cc < 16 ? '%0' + cc.toString(16) : '%' + cc.toString(16)).toUpperCase();
	});
}

function openHelp(url) { window.open(url, 'help', 'scrollbars=yes,resizable=yes,width=450,height=400').focus(); return false; }

function openPreview(url) { window.open(url || (browserIsIE ? '/shared/pages/blank.html' : 'about:blank'), 'preview', 'menubar=yes,toolbar=yes,status=yes,scrollbars=yes,resizable=yes,width=800,height=500').focus(); return !url; }

function openTray() { window.open(browserIsIE ? '/shared/pages/blank.html' : 'about:blank', 'tray', 'scrollbars=yes,resizable=yes,width=800,height=550').focus(); return true; }

function gotoNoHistory(url) { if (location.replace) location.replace(url); else location.href = url; return false; }

function $_(id) { return document.getElementById(id); }

function firstChild(elm) { if (elm) { elm = elm.firstChild; while (elm && !elm.tagName) elm = elm.nextSibling; } return elm; }

function lastChild(elm) { if (elm) { elm = elm.lastChild; while (elm && !elm.tagName) elm = elm.previousSibling; } return elm; }

function nextSibling(elm) { if (elm) { elm = elm.nextSibling; while (elm && !elm.tagName) elm = elm.nextSibling; } return elm; }

function previousSibling(elm) { if (elm) { elm = elm.previousSibling; while (elm && !elm.tagName) elm = elm.previousSibling; } return elm; }

function childAtIndex(elm, n) { elm = firstChild(elm); while (elm && (n-- > 0)) elm = nextSibling(elm); return elm; }

function hasClass(elm, className) { if (elm && elm.className) { var parts = elm.className.split(' '); for (var i = 0; i < parts.length; ++i) { if (parts[i] == className) return true; } } return false; }

function addClass(elm, className) { var parts = elm.className.split(' '); for (var i = 0; i < parts.length; ++i) { if (parts[i] == className) return; } parts.push(className); elm.className = parts.join(' '); }

function removeClass(elm, className) { var parts = elm.className.split(' '); for (var i = 0; i < parts.length; ++i) { if (parts[i] == className) { parts.splice(i, 1); elm.className = parts.join(' '); return; } } }

function toggleClass(elm, className, state) { if (state) addClass(elm, className); else removeClass(elm, className); }

var supportsStandards = ((typeof document.getElementById != 'undefined') && (typeof document.getElementsByTagName != 'undefined') && (typeof document.createElement != 'undefined') && (typeof document.createTextNode != 'undefined') && ((typeof document.addEventListener != 'undefined') || (typeof document.attachEvent != 'undefined')));

var browserIsIE = !!window.attachEvent && !document.addEventListener;

var browserIsMobile = /\bMobile\b|\bAndroid\b/.test(navigator.userAgent);

function preventDefault(evt) { if (evt.preventDefault) evt.preventDefault(); else evt.returnValue = false; }

function getRolePrefix() { var match = document.location.href.match(/(\/![0-9]+)\//); return match ? match[1] : ''; }

function formatDate(date, format)
{
  var output = '', separator, isLeap, monthdays;
  var separators = ['.','/','-',':'];
  for(var i in separators){if(format.indexOf(separators[i])>-1){separator = separators[i];break;}}
  if(typeof date != 'object')
  {
    var string_separator = '';
    for(var j in separators){if(date.indexOf(separators[j])>-1){string_separator = separators[j];break;}}
    if(string_separator == '')return '';
    date = date.split(string_separator);
    if(date[0].length>2 || isNaN(date[0]) || !date[0] || date[1].length>2 || isNaN(date[1]) || !date[1])return '';
    if(date[2])
      {
        if(isNaN(date[1]) || (date[2].length!=4 && date[2].length!=2))return '';
        if(date[2].length == 2)date[2] = '20' + date[2];
      }
    else date[2] = new Date().getFullYear();
    isLeap = !(date[2] % 4) && ((date[2] % 100) || !(date[2] % 400));
    monthdays = ['',31, (isLeap ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
    if(date[1] < 1 || date[1] > 12)return '';
    if(date[0] < 1 || date[0] > monthdays[date[1]])return '';
    date = new Date(date[2],date[1]-1,date[0]);
  }
  if(separator == '')return date;
  format = format.split(separator);
  for(var k=0;k<format.length;k++)
    {
      var type = format[k].substr(0,1);
      switch(type.toLowerCase())
      {
        case 'd': output += (date.getDate().toString().length == 1 && format[k].length > 1 ? '0' + date.getDate() : date.getDate()) + separator;
                  break;
        case 'm': output += ((date.getMonth()+1).toString().length == 1 && format[k].length > 1 ? '0' + (date.getMonth()+1).toString() : date.getMonth()+1) + separator;
                  break;
        case 'y': output += date.getFullYear().toString().substr(date.getFullYear().toString().length - format[k].length, format[k].length) + separator;
                  break;
      }
    }
  return output.substr(0, output.length-1);
}


function shroudResize() {
	var div = $_('shroud');
	if (div) {
	    var db = document.body;
		div.style.display = 'none';
		div.style.width = Math.max(db.scrollWidth, db.clientWidth) + 'px';
		div.style.height = Math.max(db.scrollHeight, db.clientHeight) + 'px';
		div.style.display = '';
	}
}

function showShroud() {
	var div = document.createElement('div');
	div.id = 'shroud';
	document.body.style.overflow = 'hidden';
	document.body.appendChild(div);
	shroudResize();
	_addEvent(window, 'resize', shroudResize);
}

function hideShroud() {
	var div = $_('shroud');
	if (div) {
		_removeEvent(window, 'resize', shroudResize);
		document.body.removeChild(div);
		document.body.style.overflow = 'auto';
	}
}

function getUrlVars() {
	var vars = [], hash;
	var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
	for(var i = 0; i < hashes.length; i++) {
		hash = hashes[i].split('=');
		vars.push(hash[0]);
		vars[hash[0]] = hash[1];
	}
	return vars;
}

/* function addEvent(): under CC-GNU LGPL license - John Resig, Mark Wubben, Dustin Diaz, Aapo Laitinen */

var EventCache = function() { }

EventCache.listEvents = new Array();

EventCache.shouldCapture = function (type) {
  return (type === 'focusin');
};

EventCache.getStandardType = function (type) {
  return (type === 'focusin' ? 'focus' : type);
};

function _removeEvent(obj, type, fn)
{
  if (obj[type+fn])
  {
    var oldFn = fn;
    fn = obj[type+fn];
    obj[type+oldFn] = null;
  }
  if (obj.removeEventListener) obj.removeEventListener(EventCache.getStandardType(type), fn, EventCache.shouldCapture(type));
  else if (obj.detachEvent) obj.detachEvent('on'+type, fn);
}

EventCache.flush = function()
{
  var item;
  while (item = EventCache.listEvents.pop()) _removeEvent(item[0], item[1], item[2]);
}

function _addEvent(obj, type, fn)
{
  return _addEventCtx(obj, type, fn, obj);
}

function _addEventCtx(obj, type, fn, ctx)
{
  if (!supportsStandards) return false;
  if (obj.addEventListener)
  {
    obj[type+fn] = function(e) { fn.call(ctx, e); }
    obj.addEventListener(EventCache.getStandardType(type), obj[type+fn], EventCache.shouldCapture(type));
  }
  else if (obj.attachEvent)
  {
    obj[type+fn] = function() { fn.call(ctx, window.event); }
    obj.attachEvent('on'+type, obj[type+fn]);
  }
  else return false;
  return true;
}

function addEvent(obj, type, fn, ctx)
{
  if (ctx ? _addEventCtx(obj, type, fn, ctx) : _addEvent(obj, type, fn))
  {
    EventCache.listEvents.push([obj, type, fn]);
    return true;
  }
  return false;
}

addEvent(window, 'unload', EventCache.flush);

$(function(){
//Tämä ei toimi quirksmodessa IE:llä, ie-ehto pois kun siirrytään html5:een
if(!browserIsIE)
  {
    if($('#l-logo').get(0) && !!$('#l-logout').get(0) && !!$('#l-breadcrumb').get(0))
      {
        var origtop = [parseInt($('#l-logo').css('top')),parseInt($('#l-logout').css('top')),parseInt($('#l-breadcrumb').css('top'))];
        var $window = $(window);
        $window.scroll(fixHeader);
        var wasScrolledLeft = null;
        var lastScrollTop = null;
        fixHeader();
      }
  }
  //opettajien luettelotulosteboksin linkki
  if($('div.sidebar-grouped.popup').get(0))
    {
      $('a.popup').click(togglePrintPopup);
      $(document.documentElement).click(function(e){
        var elm = e.srcElement||e.target;
        if(!$(elm).parents('div.sidebar-grouped.popup').get(0) && elm.className != 'sidebar-grouped popup')$('div.sidebar-grouped.popup:visible').toggle();
      });
      $(window).resize(function(){$('a.popup').each(function(){togglePrintPopup(this)})});
    }

  function fixHeader()
    {
      var scrolledLeft = ($window.scrollLeft() > 0);
      var scrollTop = (scrolledLeft ? Math.min($window.scrollTop(), 61) : 0);
      if (wasScrolledLeft !== scrolledLeft) {
        $('#l-logo, BODY.somebody #l-breadcrumb, BODY.somebody #l-logout').css({position:(scrolledLeft?'fixed':'absolute')});
        wasScrolledLeft = scrolledLeft;
      }
      if(lastScrollTop !== scrollTop)
        {
          if(scrollTop <= 60)
            {
              $('#l-logo,#l-logout,#l-breadcrumb').show().css({top:(origtop[0]-scrollTop)});
              $('#l-logout').show().css({top:(origtop[1]-scrollTop)});
              $('#l-breadcrumb').show().css({top:(origtop[2]-scrollTop)});
            }
           else
            {
              $('#l-logo,#l-logout,#l-breadcrumb').hide();
            }
        }
        lastScrollTop = scrollTop;
    }
  function togglePrintPopup(e)
  {
    var elm = e.srcElement || e.target;
    if(!elm)elm = e;
    var poselm = $(elm).closest('span.printlink');
    var pos = $(elm).offset();
    var relpos = $('#l-content').offset();
    for(var i in pos)pos[i] -= relpos[i];
    while(elm)
      {
        if($(elm).siblings('div.sidebar-grouped.popup').get(0))
          {
            var popup = $($(elm).nextAll('div.sidebar-grouped.popup:first'));
            //prevAll listaa edeltävät sisarukset käänteisessä järjestyksessä DOM:iin nähden -> first = lähin edeltävä sisaruselementti
            if(!popup.get(0))popup = $($(elm).prevAll('div.sidebar-grouped.popup:first'));
            break;
          }
        else elm = elm.parentNode;
      }
    if((poselm.offset().left + popup.width()) > (relpos.left + $('#l-content').width()))
      {
        var correction = popup.width()-poselm.width();
      }
    popup.css({'left':pos.left-(correction ? correction : 0),'top':pos.top + poselm.height()});
    if(e.type == 'click')
      {
        var wasvisible = popup.is(':visible');
        $('div.sidebar-grouped.popup:visible').toggle();
        if(!wasvisible)popup.toggle();
      }
    return false;
  }
});

//Tilapäinen korjaus ennen html5:een siirtymistä, koskee lähinnä profiililomakkeita IE:llä
//poistetaan doctypemuutoksen yhteydessä
$(function(){
  //tämä toimimaan vain tuen lomakkeissa ettei login- ja etusivu mene rikki
  var parts = document.location.href.split('/');
  if($('div.columns-right').get(0) && $('div.columns-left').get(0) && ($.inArray('specedu', parts) > -1))
    {
      if($('div.columns-right').offset().top > $('div.columns-left').offset().top)
        {
          $('div.columns-left').css({ 'position' : 'absolute', 'left' : '0px', 'right' : '260px' });
          $('div.columns-right').css({ 'width' : '250px', 'top' :'70px', 'position' : 'absolute', 'right' :'0px' });
        }
    }
});



function openEmptyPrintout() {
    // Määritellään ikkuna, johon tulostetaan
	var openWindow = window.open(getRolePrefix()+'/misc/emptyprintout', 'preview', 'menubar=yes,toolbar=yes,status=yes,scrollbars=yes,resizable=yes,width=800,height=500');
	var source2 = $(this).parent().prev('table').clone()[0];
	var items = [];
	$('.no-print', source2).each(function(){
		var index = $(this).index();
		items.push('td:nth-child('+(index+1)+')');
		items.push('th:nth-child('+(index+1)+')');
		items.push('col:nth-child('+(index+1)+')');
	});
	$(items.join(','), source2).remove();
	var watchdog = 0;
	ready();
	// Funktiolla varmistetaan, että avattavan dokumentin elementit ehtivät latautua ennen jatkotoimenpiteitä.
	function ready() {
		var target = openWindow.document && openWindow.document.getElementById('content');
		// Odotetaan max noin 30s
		if(watchdog > 300)
			return false;
        // Jos target ei ehdi mukaan, niin odotetaan 100ms ja ajetaan ready() uudelleen.
		if(!target) {
			watchdog++;
			setTimeout(ready, 100);
		} else {
			formPrint();
		}
	}
	function formPrint() {
		var source = source2.cloneNode(true);
		var target = openWindow.document.getElementById('content');
		// Siirrä linkkien tekstit taulukon soluihin ja poista 'a' elementit.
		$('a', source).each(function(index, elem){
			var $elem = $(elem);
			$elem.after($elem.contents());
			$elem.remove();
		});
		openWindow.document.getElementsByTagName('h1')[0].appendChild(openWindow.document.createTextNode($('h1').text()));
		openWindow.document.title = $('h1').text() + ' - Wilma';
		// Siirretään kopioidut node kohde-elementtiin tulostepohjassa.
		if(document.importNode) {
			target.appendChild(openWindow.document.importNode(source, true));
		} else {
			target.innerHTML = source.outerHTML;
		}
	}
}

function getPrintLinkText(){
	switch (document.documentElement ? document.documentElement.lang : '') {
		case 'sv': return 'Skriv ut';
		case 'en': return 'Print';
		default: return 'Tulosta';
	}
}

function initTableSorter(){
	var ths = $('table.datatable:not(.repeater) > thead > tr > th:not(.no-sort)');
	if(ths.length) {
		// Ei voi käyttää jQueryä, sillä se tahtoo ladata script-elementit aina uudelleen
		var scriptElm = document.createElement('script');
		scriptElm.src = '/shared/scripts/jquery/jquery.tablesorter.js';
		scriptElm.async = 'async';
		(document.head || document.getElementsByTagName('head')[0]).appendChild(scriptElm);
		ths.append('<span class="sortState">&nbsp;</span>');
	}
	var nosort_headers = [];
	$('table.datatable:not(.repeater) > thead > tr > th.no-sort').each(function(){
		var colnumber = Number($(this).parent().children().index($(this)));
		nosort_headers[colnumber] = { sorter: false };
	});

	// Kun haluaa taulukolle tulostuslinkin niin lisää taulukon classiin 'allow-printlink', taulukosta pitää myös löytyä thead ja ei saa olla classia "repeater".
	$('table.allow-printlink:not(.repeater)').has('thead').wrap('<div></div>').after('<div class="table-printlink-container"><a onclick="openEmptyPrintout.call(this); return false;" href="#">'+getPrintLinkText()+'</a></div>');
	ths.addClass('headerUnsorted').bind('click', function(){
		// Tallenna viittaus kyseiseen tableen
		var self = $(this.parentNode.parentNode.parentNode);
		// Ei tulla (eikä saa tulla) tänne enää toiste ennen uutta sivun latausta.
		$('.headerUnsorted', self).unbind('click');
		// Sarakkeen numero mitä klikattiin, tätä tarvitaan kun tehdään eka sorttaus.
		var column = $(this).parent().children().index($(this));
		// Tsekkaa onko jo luotu ettei luoda toista kertaa
		if(!self.hasClass('tablesorter'))
		{
			// Luo tablesorter olio. Aseta headerien tyylit yms asetukset.
			self.tablesorter({
				cssAsc: 'headerSortAscending',
				cssDesc: 'headerSortDescending',
				cssHeader: 'headerUnsorted',
				sortList: [[column, 0]],	// 0 -> ascending
				headers: nosort_headers
			});
			self.addClass('tablesorter');
			// Kutsutaan kun sorttaus on valmis.
			self.bind('sortEnd',function(){
				$('tr', self).removeClass('odd');	// Parittomat rivit vaihtaneet paikkaa -> poista "odd"
				$('tr:odd', self).addClass('odd');	// Lisää "odd" parittomille riveille uudestaan
			});
		}
	});
}

// tablesort.js
$(function(){
	initTableSorter();
});
