/*************************************************************************************************************
 DOC READY
/*************************************************************************************************************/
$(document).ready(function()
{	
	/** OPLEIDING DETAIL**/
	if($('body.formations.detail').length)
	{
		// _None verwijderen
		$("span:contains('_None')").remove();
		
		// remove breadcrumb bij opleiding_detail
		$('div#breadcrumb').remove();
		
		// in custom breadcrumb: link van opleidingsgroep verwijderen
		$('div.structuur span.grouplink').text($('div.structuur span.grouplink').text());
		
		// add class to inner content
		$('div#inner_content').addClass('opleidingen_wrapper');
		
		// remove overbodige data uit sidebar praktische info
		$('div.praktische-info p:empty').each(function() {
			$(this).prev('h3').remove();
			$(this).remove();
		});
				
		// opleiding als hidden data in form (v1)
		var opleiding = $('tr.name h3').text();
		$('tr.inschrijven input.opleiding').val(opleiding);
		
		// toggle inschrijvingsform opleidingen (v1)
		$('a.toggle_form').toggle(function() {
			$('tr.inschrijven').slideDown('slow');
		},function() {
			$('tr.inschrijven').slideUp('slow');
		});
		
		// slug doorgeven aan inscrivez-vous page voor hidden data (v2)
		/*
		var path = window.location.pathname;
		var slug = path.substring(path.lastIndexOf('/')+1);
		var href = $('div#right_column a.inscrivez-vous').attr('href');
		href += '#'+slug;
		$('div#right_column a.inscrivez-vous').attr('href',href);
		*/
		
		// naam_opleiding + datum doorgeven aan inscrivez-vous page voor hidden data (v3 - current)
		var naam 	= $('h1').text();
		var datum 	= $('div.praktische-info p.datum').text();
		var href 	= $('div#right_column a.inscrivez-vous').attr('href');
		href += '?date='+urlencode(datum)+'&formation='+urlencode(naam);
		$('div#right_column a.inscrivez-vous').attr('href',href);
		
		// hide lege table rows
		$('table.opleiding_detail table.opleiding_detail_data tr td:empty').parent().remove();
	}
	
	/** FILTER OPLEIDINGEN **/
	if($('div.filter_settings').length)
	{	
		// alles hiden
		$('div.opleidingen_filtered table.opleiding').hide();
		
		// calendar icon moet jquery calendar triggeren
		$('div.filter_settings p.datum img.calendar').click(function() {
			$(this).parent().find('input.hasDatepicker').focus();
		});
		
		// toggle groups bij de filters
		$('div.filter_settings input:checkbox[name="toggle_groups"]').click(function()
		{
			if($(this).attr('checked') == true) {
				$('div.filter_settings p.groep label input:checkbox').attr('checked',true);
			} else {
				$('div.filter_settings p.groep label input:checkbox').attr('checked',false);
			}
		});
		
		// init taal
		var qs = window.location.search;
		switch(qs.substr(1))
		{
			case 'en':	$('div.filter_settings input:checkbox[name="en"]').attr('checked',true);	break;
			case 'de':	$('div.filter_settings input:checkbox[name="du"]').attr('checked',true);	break;
			case 'fr':	$('div.filter_settings input:checkbox[name="fr"]').attr('checked',true);	break;
			default:	$('div.filter_settings input:checkbox[name="nl"]').attr('checked',true);	break;
		}
		
		// group als extra class bij table.opleiding
		$('div.opleidingen_filtered table tr.output td span.group').each(function() {
			var group = $(this).text();
			switch(group)
			{
				case 'Payroll':					var group_slug = 'payroll';	break;
				case 'Tax & Legal':				var group_slug = 'tax_and_legal';	break;
				case 'HR Management':			var group_slug = 'hr_management';	break;
				default: var group_slug = 'hmmm_er_ging_iets_mis';
			}
			
			//$(this).parent().parent().parent().find('tr.data input[name="group"]').val(group_slug);
			//$(this).parent().parent().parent().addClass(group_slug);
			$(this).closest('.opleiding').addClass(group_slug);
			
			// group link customizen (click filtert enkel opleiding van deze group)
			$(this).find('a').removeAttr("href");
			$(this).find('a').bind('click',function() {
				$('div.filter_settings p.groep input:checkbox').attr('checked',false);
				$('div.filter_settings p.groep input:checkbox[name="'+group_slug+'"]').attr('checked',true);
				filterOpleidingen();
			});
		});
		
		// data-row opvullen met timestamp
		$('div.opleidingen_filtered tr.output td span.date').each(function()
		{
			var system_string = $(this).text(); // custom date field bij web app item {tag_date}
			var string = str_replace('-',' ',system_string);
			var beOutput = dateFormat(string, "dd/mm/yyyy");
			var usOutput = dateFormat(string, "mm/dd/yyyy");
			var timestamp = strtotime(usOutput); // number
			$(this).parent().parent().parent().find('tr.data input[name="timestamp"]').val(timestamp);
			//$(this).text(beOutput);
		});
		
		// onload
		filterOpleidingen();
		
		// live
		$('div.filter_settings input:checkbox').click(function() {
			filterOpleidingen();
		});
		
		// dates
		$('div.filter_settings input[name="date_vanaf"]').datepicker({
			altField: '#timestamp_vanaf',
			altFormat: 'mm/dd/yy',
			onClose: function(dateText,inst) {
				var us_vanaf = $('input[name="timestamp_vanaf"]').val();
				var timestamp_vanaf = strtotime(us_vanaf);
				if(timestamp_vanaf) {
					$('input[name="timestamp_vanaf"]').val(timestamp_vanaf);
					filterOpleidingen();
				} else {
					$('input[name="timestamp_vanaf"]').val(0);
				}
			}
		});
		$('div.filter_settings input[name="date_tot"]').datepicker({
			altField: '#timestamp_tot',
			altFormat: 'mm/dd/yy',
			onClose: function(dateText,inst) {
				var us_tot = $('input[name="timestamp_tot"]').val();
				var timestamp_tot = strtotime(us_tot);
				if(timestamp_tot) {
					$('input[name="timestamp_tot"]').val(timestamp_tot);
					filterOpleidingen();
				} else {
					$('input[name="timestamp_tot"]').val(99999999999);
				}
			}
		});
	}
		
	/** ANDERE **/
	
	// variabele home banner per page refresh
	/*
	if($('body.home').length)
	{
		var randomNummer = Math.ceil(Math.random()*3); // random nr tussen 1 en 3
		$("body.home").css({'background-image' : 'url(/images/banner_0' + randomNummer + '.jpg)'});
	}
	*/
	
	// literature _blank
	$('p.literature-container a').attr('target','_blank');
	
	// pop ups using divs
	$('ul#keuzemenu li a').click(function(){
		$('ul#landenkeuze').slideToggle('medium');
		if($('ul#keuzemenu li').hasClass('expanded')) {
			$('ul#keuzemenu li').addClass('collapsed').removeClass('expanded');
		}else {
			$('ul#keuzemenu li').addClass('expanded').removeClass('collapsed');
		}
		stop();
	});
	
	// submenu detail
	$('#left_column ul li ul').hide();
	$("#left_column ul li.selected").each(function() {
		$("#left_column ul li.selected ul").css("display","block");
		$("#left_column ul li.selected ul li ul").css("display","none");
	});
	$("#left_column ul li.selected ul li.selected").each(function() {
		$("#left_column ul li.selected ul li.selected ul").css("display","block");
		$("#left_column ul li.selected ul li.selected ul li ul").css("display","none");
	});
	$("#left_column ul li.selected ul li.selected").each(function() {
		$("#left_column ul li.selected ul li.selected ul li.selected ul").css("display","block");
	});
	
	// Submenu Solutions Internationales > Solutions > subpage
	/*if($('input#pagename').length)
	{
		var subpages = new Array('SD Worx International Payroll Services','SD Worx International Payroll Services avec X-Tend Essentials','SD Worx International Payroll Services avec X-Tend Advanced','Conseil Juridique et Fiscal International','Nos Experts en Conseil Juridique et Fiscal');
		if(in_array($('input#pagename').val(), subpages))
		{
			$('li.solutions-internationales').addClass('selected');
			$('li.solutions-internationales ul').show();
			$('li.solutions-internationales ul li.solutions').addClass('selected');
		}
	}*/
	
	// hide print button from search results
	if($('div.search-result').length) {
		$('a#print_page').remove();
	}
	
	// opleidingsnaam + datum als hidden form data
	if($('form.inschrijvingsform').length)
	{
		/* OLD
		var hash = window.location.hash;		
		hash = hash.substring(hash.lastIndexOf('#')+1);
		hash = str_replace('_',' ',hash);
		$('form.inschrijvingsform input.opleiding').val(hash);
		$('h2').text(hash);
		*/
		var qs 		= window.location.search;
		var datum	= qs.substring(qs.lastIndexOf('?date=')+6, qs.lastIndexOf('&'));
		var naam	= qs.substring(qs.lastIndexOf('&')+11);
		
		$('form.inschrijvingsform input.opleiding').val(urldecode(naam) + ' ('+urldecode(datum)+')');
		$('h2').text(urldecode(naam));
		$('h3').text(urldecode(datum));
	}
		
	// ie6 notice
	/*if($.browser.msie && $.browser.version == '6.0') { ie6Notice(); }*/
});

/*************************************************************************************************************
 FUNCTIONS
/*************************************************************************************************************/
function filterOpleidingen()
{
	$('div.opleidingen_filtered p.no_results').remove();
	
	// taalkeuze
	if($('input[name="en"]').attr('checked')) { $('table.opleiding.EN').show(); } else { $('table.opleiding.EN').hide(); }
	if($('input[name="fr"]').attr('checked')) { $('table.opleiding.FR').show(); } else { $('table.opleiding.FR').hide(); }
	if($('input[name="du"]').attr('checked')) { $('table.opleiding.DU').show(); } else { $('table.opleiding.DU').hide(); }
	if($('input[name="nl"]').attr('checked')) { $('table.opleiding.NL').show(); } else { $('table.opleiding.NL').hide(); }
	
	// opleidingsgroepen
	if($('input[name="payroll"]').attr('checked')) 			{ $('table.payroll:visible').show(); 			}	else { $('table.payroll:visible').hide(); }
	if($('input[name="tax_and_legal"]').attr('checked')) 	{ $('table.tax_and_legal:visible').show();		}	else { $('table.tax_and_legal:visible').hide(); }
	if($('input[name="hr_management"]').attr('checked')) 	{ $('table.hr_management:visible').show(); 		}	else { $('table.hr_management:visible').hide(); }
	
	// huidige visible tables: show-hide date range
	$('table.opleiding:visible').each(function() {
		var timestamp = $(this).find('tr.data td input[name="timestamp"]').val();
		timestamp = Number(timestamp);
		var vanaf = Number($('p.timestamp input#timestamp_vanaf').val());		
		var tot = Number($('p.timestamp input#timestamp_tot').val());
		// valt de opleiding binnen de gekozen date range?
		if(vanaf <= timestamp && timestamp <= tot) {
			$(this).show();
		} else {
			$(this).hide();
		}
	});
	
	// zijn er nog wel results?
	$('p.aantal_results').remove();
	if($('table.opleiding:visible').size() == 0) {
		$('div.opleidingen_filtered').append('<p class="no_results">Geen resultaten op basis van de ingestelde filters.</p>');
	} else {
		$('h1').after('<p class="aantal_results"><strong>'+ $('table.opleiding:visible').size() +' resultaten</strong></p>');
	}	
}

function strtotime(str, now)
{ 
    var i, match, s, strTmp = '', parse = '';

    strTmp = str;
    strTmp = strTmp.replace(/\s{2,}|^\s|\s$/g, ' '); // unecessary spaces
    strTmp = strTmp.replace(/[\t\r\n]/g, ''); // unecessary chars

    if (strTmp == 'now') {
        return (new Date()).getTime()/1000; // Return seconds, not milli-seconds
    } else if (!isNaN(parse = Date.parse(strTmp))) {
        return (parse/1000);
    } else if (now) {
        now = new Date(now*1000); // Accept PHP-style seconds
    } else {
        now = new Date();
    }

    strTmp = strTmp.toLowerCase();

    var __is =
    {
        day:
        {
            'sun': 0,
            'mon': 1,
            'tue': 2,
            'wed': 3,
            'thu': 4,
            'fri': 5,
            'sat': 6
        },
        mon:
        {
            'jan': 0,
            'feb': 1,
            'mar': 2,
            'apr': 3,
            'may': 4,
            'jun': 5,
            'jul': 6,
            'aug': 7,
            'sep': 8,
            'oct': 9,
            'nov': 10,
            'dec': 11
        }
    };

    var process = function (m) {
        var ago = (m[2] && m[2] == 'ago');
        var num = (num = m[0] == 'last' ? -1 : 1) * (ago ? -1 : 1);

        switch (m[0]) {
            case 'last':
            case 'next':
                switch (m[1].substring(0, 3)) {
                    case 'yea':
                        now.setFullYear(now.getFullYear() + num);
                        break;
                    case 'mon':
                        now.setMonth(now.getMonth() + num);
                        break;
                    case 'wee':
                        now.setDate(now.getDate() + (num * 7));
                        break;
                    case 'day':
                        now.setDate(now.getDate() + num);
                        break;
                    case 'hou':
                        now.setHours(now.getHours() + num);
                        break;
                    case 'min':
                        now.setMinutes(now.getMinutes() + num);
                        break;
                    case 'sec':
                        now.setSeconds(now.getSeconds() + num);
                        break;
                    default:
                        var day;
                        if (typeof (day = __is.day[m[1].substring(0, 3)]) != 'undefined') {
                            var diff = day - now.getDay();
                            if (diff == 0) {
                                diff = 7 * num;
                            } else if (diff > 0) {
                                if (m[0] == 'last') {diff -= 7;}
                            } else {
                                if (m[0] == 'next') {diff += 7;}
                            }
                            now.setDate(now.getDate() + diff);
                        }
                }
                break;

            default:
                if (/\d+/.test(m[0])) {
                    num *= parseInt(m[0], 10);

                    switch (m[1].substring(0, 3)) {
                        case 'yea':
                            now.setFullYear(now.getFullYear() + num);
                            break;
                        case 'mon':
                            now.setMonth(now.getMonth() + num);
                            break;
                        case 'wee':
                            now.setDate(now.getDate() + (num * 7));
                            break;
                        case 'day':
                            now.setDate(now.getDate() + num);
                            break;
                        case 'hou':
                            now.setHours(now.getHours() + num);
                            break;
                        case 'min':
                            now.setMinutes(now.getMinutes() + num);
                            break;
                        case 'sec':
                            now.setSeconds(now.getSeconds() + num);
                            break;
                    }
                } else {
                    return false;
                }
                break;
        }
        return true;
    };

    match = strTmp.match(/^(\d{2,4}-\d{2}-\d{2})(?:\s(\d{1,2}:\d{2}(:\d{2})?)?(?:\.(\d+))?)?$/);
    if (match != null) {
        if (!match[2]) {
            match[2] = '00:00:00';
        } else if (!match[3]) {
            match[2] += ':00';
        }

        s = match[1].split(/-/g);

        for (i in __is.mon) {
            if (__is.mon[i] == s[1] - 1) {
                s[1] = i;
            }
        }
        s[0] = parseInt(s[0], 10);

        s[0] = (s[0] >= 0 && s[0] <= 69) ? '20'+(s[0] < 10 ? '0'+s[0] : s[0]+'') : (s[0] >= 70 && s[0] <= 99) ? '19'+s[0] : s[0]+'';
        return parseInt(this.strtotime(s[2] + ' ' + s[1] + ' ' + s[0] + ' ' + match[2])+(match[4] ? match[4]/1000 : ''), 10);
    }

    var regex = '([+-]?\\d+\\s'+
        '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+
        '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday'+
        '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday)'+
        '|(last|next)\\s'+
        '(years?|months?|weeks?|days?|hours?|min|minutes?|sec|seconds?'+
        '|sun\\.?|sunday|mon\\.?|monday|tue\\.?|tuesday|wed\\.?|wednesday'+
        '|thu\\.?|thursday|fri\\.?|friday|sat\\.?|saturday))'+
        '(\\sago)?';

    match = strTmp.match(new RegExp(regex, 'gi'));
    if (match == null) {
        return false;
    }

    for (i = 0; i < match.length; i++) {
        if (!process(match[i].split(' '))) {
            return false;
        }
    }

    return (now.getTime()/1000);
}

/*
 * Date Format 1.2.3
 * (c) 2007-2009 Steven Levithan <stevenlevithan.com>
 * MIT license
 * http://blog.stevenlevithan.com/archives/date-time-format
 * 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",
	beDate:      	"dd/mm/yyyy",
	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: [
		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
		"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
	],
	monthNames: [
		"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
		"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
	]
};

// For convenience...
Date.prototype.format = function (mask, utc) {
	return dateFormat(this, mask, utc);
};

function str_replace (search, replace, subject, count) {
    var i = 0, j = 0, temp = '', repl = '', sl = 0, fl = 0,
            f = [].concat(search),
            r = [].concat(replace),
            s = subject,
            ra = r instanceof Array, sa = s instanceof Array;
    s = [].concat(s);
    if (count) {
        this.window[count] = 0;
    }

    for (i=0, sl=s.length; i < sl; i++) {
        if (s[i] === '') {
            continue;
        }
        for (j=0, fl=f.length; j < fl; j++) {
            temp = s[i]+'';
            repl = ra ? (r[j] !== undefined ? r[j] : '') : r[0];
            s[i] = (temp).split(f[j]).join(repl);
            if (count && s[i] !== temp) {
                this.window[count] += (temp.length-s[i].length)/f[j].length;}
        }
    }
    return sa ? s : s[0];
}

function in_array (needle, haystack, argStrict) {
    var key = '', strict = !!argStrict;

    if (strict) {
        for (key in haystack) {
            if (haystack[key] === needle) {
                return true;
            }
        }
    } else {
        for (key in haystack) {
            if (haystack[key] == needle) {
                return true;
            }
        }
    }

    return false;
}

function urlencode (str) {
    str = (str+'').toString();
    // Tilde should be allowed unescaped in future versions of PHP (as reflected below), but if you want to reflect current
    // PHP behavior, you would need to add ".replace(/~/g, '%7E');" to the following.
    return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
}
function urldecode (str) {    
    return decodeURIComponent((str+'').replace(/\+/g, '%20'));
}
