/***************************************************************************
 * Start of related vocabularies javascript functions
 **************************************************************************/

/**
 * 
 */
function updateRelatedTerms(caller, srcVdexId, json ) {
    var selected = caller.checked;
    
	for (var srcTermId in json) {
		var extTermsByExtVdexId = json[srcTermId];
		for (var extVdexId in extTermsByExtVdexId) {
		    var extTermIds = extTermsByExtVdexId[extVdexId];
		    for (var i in extTermIds) {
		    	var extTermId = extTermIds[i];
		    	updateRelatedTerm(srcVdexId, srcTermId, extVdexId, extTermId , selected);
		    }
		}
	}
}

/**
 * Voeg per unieke combinatie van bron en doel term een 'relatedTerm_&lt;uniekId&gt;' class toe.
 * Als er 1 van zo'n classe is zet dan ook de class 'relatedTerm'. Is er geen een dan wordt deze classe
 * weggehaald. Door per unieke combinatie dit bij te houden wordt op het juiste moment de class getoggelt. 
 * 
 * @param srcVdexId
 * @param srcTermId
 * @param extVdexId
 * @param extTermId
 * @param selected
 * @return
 */
function updateRelatedTerm(srcVdexId, srcTermId, extVdexId, extTermId, selected) {
    var listItemId = extVdexId + "_" + extTermId + "_group";
	var relatedLabel = document.getElementById(listItemId);
    if (relatedLabel != null) {
    	var srcId = srcVdexId + "_" + srcTermId;
    	if (selected) {
    		$(relatedLabel).addClass("relatedTerm_" + srcId);
    	} else {
    		$(relatedLabel).removeClass("relatedTerm_" + srcId);
    	}
    	var className = $(relatedLabel).attr("class");
    	var related = containsRelatedTermClass(className);
    	$(relatedLabel).toggleClass("relatedTerm", related);
	}
}

function containsRelatedTermClass(className) {
	var classes = className.length ? className.split(/\s+/) : [];
	for (i in classes) {
		clazz = classes[i];
		if (clazz.match("^relatedTerm_.*")) {
			return true;
		} 
	}
	return false;
}

/***************************************************************************
 * End of related vocabularies
 **************************************************************************/

/***************************************************************************
 * Custom trim implementation because jQuery trim function doesn't work in IE8
 **************************************************************************/
function ieSafeTrim(str) {
	if (str == null) {
		return null;
	}
	return str.replace(/(^[\s\xA0]+|[\s\xA0]+$)/g, '');
}

$(function() {

    var originalForm = $('#globalsearchform');
    var isAlreadySubmitting = false;
    
    var forcePageRefresh = false;

    originalForm.submit(function(event) {
        if (!originalForm.hasClass('dynamic')) {
            return true;    
        }

        if (isAlreadySubmitting) return false;
        isAlreadySubmitting = true;
        
        event.preventDefault();

        // prepare for next change
        var dynamicForm = form;

        var link = $('div.summary .results');
        link.addClass('loading').text('er wordt geteld');

        $.post(dynamicForm.attr('action'), dynamicForm.serialize(), function(data) {
            if (forcePageRefresh) {
                location.reload();
            } else {
                $('div.summary').html(data);
                form = originalForm.clone( true /* include event listeners */ );
            }
            isAlreadySubmitting = false;
            
        }, 'html');
        
        return false;
    });
    
    var form = originalForm.hasClass('dynamic')
             ? originalForm.clone( true /* include event listeners */ )
             : originalForm;


	/***************************************************************************
	 * Selects the text in the search field when its equal to the default keyword.
	 **************************************************************************/
  	var defaultKeyword = ieSafeTrim($('input[name=defaultKeyword]').val());
 	var currentKeyword = ieSafeTrim($('#keyword').val());
 	if (defaultKeyword && currentKeyword) {
 		if (currentKeyword == defaultKeyword) {
 			$('#keyword').select();
 		}
 		$('#keyword').focus(function(){
 			 // Check for the change
 			if(ieSafeTrim(this.value) ==  defaultKeyword){
 				 this.select();
 			}
 		});
 	}
                    
    /***************************************************************************
     * Adds the given tuple to the search field.
     **************************************************************************/
    function addField(name, value) {
        $('<input type="hidden" name="' + name + '" />').attr('value', value)
                .appendTo(form);
    }

    function checkSelection(i, inputElement) {
        $(inputElement).siblings('ul')
        		.find('input')
        		.attr('checked', $(inputElement).attr('checked'))
                .attr('indeterminate', false);
        $(inputElement).each(checkParentForSelection);
    }

    /***************************************************************************
     * Applies the selection state to parent elements
     **************************************************************************/
    function checkParentForSelection() {
        var group = $(this).parents('li:has(ul):first');
        var allChecked = group.find('ul > li > input:not(:checked)').length == 0;
        var allUnchecked = group.find('ul > li > input:checked').length == 0;
        group.children('input').attr('checked', allChecked)
                               .attr('indeterminate', !allChecked && !allUnchecked);

        group.parents('li').children('input:first').each(checkParentForSelection); // recurse upwards the tree
    }

    /***************************************************************************
     * Add keyword to search
     **************************************************************************/
    $('div.search.keyword form').submit(function(event) { event.preventDefault();
        var keyword = $('input[name=keyword]', this).val();
        if (keyword) {
            $('input[name=keyword]', this).attr('value', '');
            addField('keyword', keyword);
            form.submit();
        }
    });
    $('div.search.keyword a.add').click(function() {
        $(this).parents('form').submit();
        return false;
    });

    /***************************************************************************
     * Sort order block
     **************************************************************************/
    $('div.results #searchForm #sortOrder').change(function() {
        var valuePart = $(this).val();
        if (valuePart) { // not the 'empty' option
            addField('sortOrder', valuePart);
            form.submit();
        }
    });

    /***************************************************************************
     * Items per page block
     **************************************************************************/
    $('div.results #searchForm #itemsPerPage').change(function() {
        var valuePart = $(this).val();
        if (valuePart) { // not the 'empty' option
            addField('itemsPerPage', valuePart);
            form.submit();
        }
    });

    /***************************************************************************
     * Filter blocks (vdex, collections, certificates)
     **************************************************************************/
    $('div.search.certification, div.search.collections, div.search.publishers, div.search.filter, div.search.learningpath, div.lom.keywords, div.lom.learningpath, .lom.publisher, div.lompager').each(function() {

        var blockId = $(this).attr('id'); // id is used to determine which filter is controlled here
        if (blockId) blockId = '[' + blockId + ']';

        /***********************************************************************
         * Links trigger a search immediately on the results page
         **********************************************************************/
        $('a[rel]', this).click(function(event) {
            event.stopPropagation(); // prevent folding of the group above
            event.preventDefault(); // don't make the view port scroll to the top

            var rel = $(this).attr('rel');
            var split = rel.indexOf('[');
            var namePart = rel.substring(0, split) + blockId;
            var valuePart = rel.substring(split + 1, rel.length - 1);

            addField(namePart, valuePart);
            
            form.submit();
        });

        /***********************************************************************
         * Check boxes on the advanced search page
         **********************************************************************/
        $('input', this).click(function(event) { event.stopPropagation(); // prevent folding of the group above
            if (isAlreadySubmitting) return false;
            var isChecked = $(this).attr('checked');
            
            var link = $('div.summary .results');
            link.addClass('loading').text('er wordt geteld');

            var context = this;
            setTimeout(function() {
                checkSelection(0, context);
                addField('delta', isChecked ? 'add' : 'remove');
                $(context).parents('div.block').find(isChecked ? 'input:checked' : 'input:not(:checked)').each(function() {                
                    addField($(this).attr('name') + blockId, $(this).val());
                });
                form.submit();
            }, 10);
            
        });

        $('input.indeterminate', this).attr('indeterminate', true);
    });

    /***************************************************************************
     * Summary blocks
     **************************************************************************/
    $('div.summary').each(function() {

        /***********************************************************************
         * Links that remove a search constraint from the current search
         **********************************************************************/
        $('a[rel]:not(.all).remove', this).live('click', function(event) { 
            event.preventDefault(); // don't make the view port scroll to the top
        	
            var rel = $(this).attr('rel');
            var split = rel.indexOf('[');
            var namePart = rel.substring(0, split);
            var valuePart = rel.substring(split + 1, rel.length - 1);

            if (namePart == 'collections' || namePart == 'publishers' || namePart == 'certificationGroups' || namePart == 'optionalConditionKeys') {
                $('input[name=' + namePart + '][value=' + valuePart + ']')
                        .removeAttr('checked')
                        .each(checkSelection);
            } else if (namePart != 'keyword') {
                $('div#' + namePart + ' input[value=' + valuePart + ']')
                        .removeAttr('checked')
                        .each(checkSelection);
                namePart = 'filter[' + namePart + ']';
            }

            addField('delta', 'remove');
            addField('cascade', true);
            addField(namePart, valuePart);
            
            // forceer een page refresh
        	forcePageRefresh = $(this).hasClass('refresh') && form.hasClass('dynamic');
        	
            form.submit();

        });

        $('a.remove.all', this).live('click', function(event) { 
            $('input').removeAttr('checked').removeAttr('indeterminate');
            addField('reset', true);

            // forceer een page refresh
            forcePageRefresh = form.hasClass('dynamic');
            
            form.submit();
            
        });
    });
    
    /***************************************************************************
     * SubSelections
     **************************************************************************/
    $('ul.subselections').each(function() {

        /***********************************************************************
         * Links trigger a search immediately on the results page
         **********************************************************************/
        $('a[rel]', this).click(function(event) {
            //event.stopPropagation(); // prevent folding of the group above
            //event.preventDefault(); // don't make the view port scroll to the top

            var rel = $(this).attr('rel');
            var split = rel.indexOf('[');
            var namePart = rel.substring(0, split);
            var valuePart = rel.substring(split + 1, rel.length - 1);

            addField(namePart, valuePart);
            
            form.submit();
        });
    	
    });

});

