$.fn.setCursorPosition = function(pos) {
  this.each(function(index, elem) {
    if (elem.setSelectionRange) {
      elem.setSelectionRange(pos, pos);
    } else if (elem.createTextRange) {
      var range = elem.createTextRange();
      range.collapse(true);
      range.moveEnd('character', pos);
      range.moveStart('character', pos);
      range.select();
    }
  });
  return this;
};

String.prototype.endsWith = function(str) {
	return (this.match(str+"$")==str);
}

function filterList(block) {
    
	var thefilterDiv = $("<div>").attr({"class":"filterbox"}),
	form = $("<form>").attr({"class":"filterform","action":"#"}),
	input = $("<input>").attr({"class":"filterinput","type":"text"});
	
	$(form).append(input)
	$(thefilterDiv).append(form);
	$(block).prepend(thefilterDiv);
	
	$(input).change( function () {
		var filter = $(this).val();
		if(filter) {
			$(block).find("label:not(:Contains(" + filter + "))").parent().hide();
			$(block).find("label:Contains(" + filter + ")").parent().show();
		} else {
			$(block).find("li").show();
		}
		return false;
	})
	.keyup( function () {
		setTimeout($(this).change(),300);
	});
}

$(function() {
	// custom css expression for a case-insensitive contains()
	jQuery.expr[':'].Contains = function(a,i,m){
		return (a.textContent || a.innerText || "").toUpperCase().indexOf(m[3].toUpperCase())>=0;
	};
	
	filterList($(".publishers .content"));

    var Util = {

        /**
         * Answers whether the given file is an image file or not.
         */
        isImage: function(fileName) { fileName = fileName || '';
            var split = fileName.lastIndexOf('.');
            var extension = split < 0 ? '' : fileName.substring(split+1);
            extension = extension.toLowerCase();

            return $.inArray(extension, [ 'jpg', 'jpeg', 'png', 'gif' ]) >= 0;
        }
    };

	$('div.header ul.tabs a').corner('top 5px');
    $(':text, div.twitter textarea:empty').labelify();
    $('div.twitter, textarea').easyTooltip();
    $('form.search select').dropdown();

    $('form.search input').focus(function() {
        $(this).parent().css('border-color', '#FFAD01');
    });
    $('form.search input').blur(function() {
        $(this).parent().css('border-color', '');
    });

    $('form.toggleSavedSearchUpdates input[type=checkbox]').change(function() {
        $(this).parents('form:first').submit();
    });

    if( $('#copyUrlArea').focus().select().length < 1 ) {
        // focus the copy url area if it exists, otherwise focus on the search bar
        $('form.search input.query').each(function(queryInputField) {
        	var queryInputField = $(this);
        	queryInputField.focus();
        	var pos = queryInputField.val().length;
        	queryInputField.setCursorPosition(pos);
        });
    } 

    $('select.live').change(function() {
        $(this).parents('form').submit();
    });

    $('a[title!=""]').easyTooltip();
    $('div.help, img.altpopup').easyTooltip();

    /**
     * 
     */
    $('textarea[maxlength]').maxlength();
    
    $('div.portlet.tabs').each(function(i, tabGroup) {
        var tabGroupId = $(tabGroup).attr('id');

        $('ol.tabs li', this).click(function() {
            var j = $(this).parent().children().index($(this));
            $('ol.tabs li, div.tab', tabGroup).removeClass('active');
            var tabId = $(this).addClass('active').attr('id');
            $('div.tab:eq(' + j + ')', tabGroup).addClass('active');

            $.get('/twisty', {
                twistyId: tabGroupId,
                state: tabId
            });
        });
    });


    $('div.authenticatedornot.tabs').each(function(i, tabGroup) {
        var tabGroupId = $(tabGroup).attr('id');

        $('ol.tabs li', this).click(function() {
            var j = $(this).parent().children().index($(this));
            $('ol.tabs li, div.tab', tabGroup).removeClass('active');
            var tabId = $(this).addClass('active').attr('id');
            $('div.tab:eq(' + j + ')', tabGroup).addClass('active');
        });
    });

    $('div.myRecentlyAddedFavourites div.tabs,div.myRecentlyCertifiedLearningObjects div.tabs').each(function(i, tabGroup) {
        var tabGroupId = $(tabGroup).attr('id');

        $('ol.tabs li', this).click(function() {
            var j = $(this).parent().children().index($(this));
            $('ol.tabs li', tabGroup).removeClass('current');
            $('div.tab', tabGroup).removeClass('active');
            var tabId = $(this).addClass('current').attr('id');
            $('div.tab:eq(' + j + ')', tabGroup).addClass('active');
        });
    });

    /***************************************************************************
     * Confirm blocks can be discarded by the user
     **************************************************************************/
    $('ol.confirm').not('.noclose').each(function() {
        var confirmBlock = $(this);
        var hideTrigger = function(event) {
            event.preventDefault();
            confirmBlock.hide('fast');
        }

        $('<a />').addClass('close').appendTo(confirmBlock).click(hideTrigger);
    });

    /***************************************************************************
     * Warning blocks can be discarded by the user
     **************************************************************************/
    $('ol.warning').each(function() {
        var warningBlock = $(this);

        var hideTrigger = function(event) {
            event.preventDefault();
            warningBlock.hide('fast');
        }

        $('<a />').addClass('close').appendTo(warningBlock).click(hideTrigger);
    });

    /***************************************************************************
     * Link om een semi redirect te geven vanuit een render fase van een portlet.
     * Gebruikt door activatie. 
     **************************************************************************/
    $('a.link-redirect-onload').each(function() {
        var href = $(this).attr("href");
        document.location.replace(href);
        setTimeout(function() {
            $(this).show();
        }, 10*1000);
        return false;
    });

    /***************************************************************************
     *  Search Results Portlet
     **************************************************************************/
    $('div.lom').each(function() {
        var block = this;
        
        $('img.altpopup', block).easyTooltip();
        
        if($.browser.msie) $('input[name=certify]', this).click(function() { $(this).change().focus(); });
        $('input[name=certify]', this).change(function() {
            $(this).parents('form').submit();
        });
        
        $('a.alterCerticifation', this).click(function() {
            var anchor = $(this);
        	var form = $(this).parent();
        	var certifiedBefore = $('input[name=certify]', form).attr('checked');
        	$('input[name=certify]', form).attr('checked', !certifiedBefore);

            var newLabel = $('<span title="Je actie wordt verwerkt. Dit kan even duren.">Wordt verwerkt</span>');
            newLabel.css('cursor', 'default');
            newLabel.easyTooltip();
        	
            $.ajax({
                url: form.attr('action'),
                type: 'post',
                dataType: 'json',
                data: {
                    certified: $('input[name=certify]', form).attr('checked'),
                    groupId: $('input[name=groupId]', form).val(),
                    learningObjectUri: $('input[name=uri]', form).val()
                },
                beforeSend: function() {
                    anchor.replaceWith(newLabel);
                    $('#easyTooltip').remove();
                },
                error: function() {
                    var errorLabel = $('<span>Keurmerken mislukt</span>');
                    newLabel.replaceWith(errorLabel);
                    errorLabel.css('cursor', 'default');
                    $('#easyTooltip').remove();
                }
            });
            return false;
        });
    });

    /***************************************************************************
     * Detail pages
     **************************************************************************/
    $('div.lom.reviews').each(function(i, block) {

        $('a.inappropriate').click(function(event) { event.preventDefault();
            var form = $('form.report', block);
        
            if (form.parent().attr('smoid') != $(this).parent().parent().attr('smoid')) {
                var idValue = $(this).parent().parent().attr('smoid');
                var reviewerName = $('.reviewerName', $(this).parent()).html();
                
                $('div.error', form).addClass('hidden');
                $('.error', form).removeClass('error');
                $('textarea[name=info]', form).attr('value', '');
                $('input[name=smoId]', form).attr('value', idValue);
                $('input[name=reviewerName]', form).attr('value', reviewerName);
                form.prependTo($(this).parent().parent())
                                     .removeClass('hidden');
            }
        });

        $('form.report:has(div.error)', block).each(function() {
            var smoId = $('input[name=smoId]', this).val();
            $(this).prependTo($('li[smoid=' + smoId + ']', block))
                   .removeClass('hidden');
            var position = $(this).parent().position();
            window.scrollTo(position.left, position.top);
        });

		if ($('div.error', block).length > 0 || window.location.href.endsWith("/beoordeel")){
			$('div.review').show();
			$('a.addReview').hide();
		} else {
			$('div.review').hide(); 
			$('a.addReview').show();
		}
		
		var toggleReviewHandler = function() { 
			$('div.review').toggle();
			$('a.addReview').toggle();
		} 	
		$('a.addReview').click(toggleReviewHandler);

    });

    /***************************************************************************
     * Profile portlet
     **************************************************************************/
    $('form.profile select[name=educationalLevels].' + $('form.profile select[name=sector]').val()).show();
    $('form.profile select[name=sector]').change(function() {
        $('form.profile select[name=educationalLevels]').hide();
        $('form.profile select[name=educationalLevels] option').removeAttr('selected');
        $('form.profile select[name=educationalLevels].' + $(this).val()).show();
    });

    $('div.dialog.picture').each(function() {
        var dialog = this;

        $('form', dialog).jup({ // prepare for ajax upload
            json: false,
            validate: function(fields) {
                var isValid = Util.isImage(fields['file']);
                if (!isValid) {
                    $('p.warn', dialog).css('color', '#B90125');
                }

                return isValid;
            },
            beforeUpload: function() {
                $('div.dialog.picture form button[type=reset]').click();
            },
            onComplete: function(response) {
                var url = $('div.icon img').attr('src');
                $('div.icon img').attr('src', url + '&r');
                $('a.#remove_picture').removeClass('not_visible');
            }
        });
    });

    $('div.dialog.remove_picture').each(function() {
        var dialog = this;

        $('form', dialog).jup({ // prepare for ajax call
            json: false,
            beforeUpload: function() {
                $('div.dialog.remove_picture form button[type=reset]').click();
            },
            onComplete: function(response) {
                var url = $('div.icon img').attr('src');
                $('div.icon img').attr('src', url + '&r');
                $('a.#remove_picture').addClass('not_visible');
            }
        });
    });

    $('div.dialog.icon').each(function() { // FIXME duplicate of the above?
        var dialog = this;

        $('form', dialog).jup({ // prepare for ajax upload
            json: false,
            validate: function(fields) {
                var isValid = Util.isImage(fields['file']);
                if (!isValid) {
                    $('p.warn', dialog).css('color', '#B90125');
                }
    
                return isValid;
            },
            beforeUpload: function() {
                $('div.dialog.icon form button[type=reset]').click();
            },
            onComplete: function(response) {
                var url = $('div.icon img').attr('src');
                $('div.icon img').attr('src', url + '&r');
            }
        });
    });

    /***************************************************************************
     *  Twisty support
     **************************************************************************/
    $('.twisty').each(function() {
        var twisty = $(this);

        twisty.click(function(event) {
            event.stopPropagation(); // prevent recursive folding of the parent groups
            
            $(this).children(':not(.help,label):eq(1)').slideToggle('fast'); // animate the folding of the *second* child
            twisty.toggleClass('collapsed');

            $.get('/twisty', {
                twistyId: twisty.attr('id'),
                state: twisty.hasClass('collapsed') ? 'collapsed' : 'expanded'
            });
        });

        $(/* children that should not cause this twisty to fold: */ 'div.content, ul', this).click(function(event) {
            event.stopPropagation();
        });
        
    });
    $('.twisty:has(.error,.confirm)').each(function() {
    	$(this).removeClass("collapsed").addClass("expanded");
    });
    /***************************************************************************
     *  ImageCaptchaController
     **************************************************************************/
    $('.captchaReload').click(function() {                 
        var randomnumber = Math.floor(Math.random()*1000);
        $(this).parents('table.captcha').each(function() {
            var captcha = $('img.captcha', this);
            $(captcha).attr('src', captcha.attr('src') + '&r=' + randomnumber);
        });
        return false;
    });
    
    /***************************************************************************
     *  Add to favourites
     **************************************************************************/
    $('.addToFavourites a.enabled').click(function() {
        var thisElement = this;
        $.ajax({
            url: $(this).attr('href'),
            type: 'get',
            beforeSend: function() { $(thisElement).mouseout(); },
            success: function(data) { $(thisElement).replaceWith('<div class="favouritesLink button">Opgeslagen in <a href="/account/favorieten/home.psml">favorieten</a></div>')},
            error: function(request, status, e) {}
        });
        return false;
    });

    /***************************************************************************
     *  Stars: http://orkans-tmp.22web.net/star_rating/index.html#overview
     **************************************************************************/
    $("#stars-wrapper1").stars({
        oneVoteOnly: false,
        cancelShow: false
    });

    $('.rate form').stars({
        oneVoteOnly: true,
        callback: function(ui, type, value) {
            ui.element.submit();
        }
    });

    /***************************************************************************
     *  Load saved search from pulldown
     **************************************************************************/
    $("select.savedSearches").change(function() {
        document.location.replace($(this).val());
     });


    /***************************************************************************
     * FAQ
     **************************************************************************/
    $('div.faq a.all').click(function(event) { event.preventDefault();
        $('div.faq dd').show();
    });
    $('div.faq dt a').click(function(event) { event.preventDefault();
        var content = $(this).parent().next();
        if (content.css('display') != 'block') { // only if this content is collapsed
            $('div.faq dd').css('display', 'none'); // first hide all
            content.show(); // then display the content
        }
    });

    var complaintTypeChangeHandler = function() {
    	var complaintType = $(this).val();
    	if  (complaintType == 'Ongepaste tekst' || complaintType == 'Verkeerde gegevens') {
    		if (complaintType == 'Ongepaste tekst') {
    			$('form#inappropriateLomForm fieldset.checkboxLists label[for=fieldList]')
    				.text('Welk(e) veld(en) bevat(ten) ongepaste tekst? *');
    		}
    		if (complaintType == 'Verkeerde gegevens') {
    			$('form#inappropriateLomForm fieldset.checkboxLists label[for=fieldList]')
    				.text('Welk(e) veld(en) bevat(ten) verkeerde gegevens? *');
    		}
            $('form#inappropriateLomForm fieldset.checkboxLists').show();
    	} else {
            $('form#inappropriateLomForm fieldset.checkboxLists').hide();
    	}
    };
    $('form#inappropriateLomForm select[name=complaintType]')
    	.each(complaintTypeChangeHandler)
    	.change(complaintTypeChangeHandler)
    	.keypress(complaintTypeChangeHandler);
    
    $('form#inappropriateLomForm:has(div.error)').each(function() {
    	$.scrollTo($('div.inappropriatelom'), {duration: 300 });
    }); 
	
	$('div.inappropriatelom:has(div.success)').each(function() {
		 $.scrollTo($('div.inappropriatelom'), {duration: 300});
	});
  
});
