var XOLRN = XOLRN || {};
XOLRN.CKEDITOR = XOLRN.CKEDITOR || {};

XOLRN.CKEDITOR.readyCallback = function (editor) {
  XOLRN.CKEDITOR.initializeCollapser(editor);
  $(editor.element.$.form).data("ckeditor-instance", editor.name);
  $(editor.element.$.form).submit(function(e) {
    XOLRN.CKEDITOR.transformMediaTagsToWikiLinks(this);
  });
  window.setTimeout(function(){
    editor.setData(XOLRN.CKEDITOR.transformWikiLinksToMediaTags(editor.getData()));
  }, 10);
};

$(function() {
    $('.test #ibook-initial input[name=__action_submit], .test #ibook-single input[name=__action_submit]').click(function() {
        var button_yes = $('#submit_confirm').attr('button_yes');
        var button_no = $('#submit_confirm').attr('button_no');
        var buttons = {}
        buttons[button_yes] = function () {
		$(this).dialog("close");
		$('input[name=__action_submit]').unbind('click').click();
        }
        buttons[button_no] = function () {
		$('input[name=__action_submit_disabled]').remove();
		$('input[name=__action_submit]').show();
		$(this).dialog("close");
        }
        $('#submit_confirm').dialog({
                    modal: true,
                    title: '',
                    zIndex: 10000,
                    autoOpen: true,
                    width: 'auto',
                    resizable: false,
                    buttons: buttons,
                    close: function (event, ui) {
                    }
            });
            return false;
    });
});

function get_popular_tags(popular_tags_link, prefix) {
  var http = getHttpObject();
  http.open('GET', popular_tags_link, true);
  http.onreadystatechange = function() {
    if (http.readyState == 4) {
      if (http.status != 200) {
	alert('Something wrong in HTTP request, status code = ' + http.status);
      } else {
       var e = document.getElementById(prefix + '-popular_tags');
       e.innerHTML = http.responseText;
       e.style.display = 'block';
      }
    }
  };
  http.send(null);
}

$.ajaxSetup({ cache: false });

//used in SELENIUM, TODO: move it to Selenium
function selenium_setRange(editor,index,start,end) {
  var doc = editor.document;
  var range = new CKEDITOR.dom.range(doc);
  var node = doc.getBody().getChildren().getItem(index);
  range.setStart(node, start);
  range.setEnd(node, end);
  editor.getSelection().selectRanges( [range] ); 
}

// FIXME: This is not robust and doesnt work always
XOLRN.CKEDITOR.switchVisibilityAfter1stRow = function (toolbox, show) {
        var inFirstRow = true;
        var elements = toolbox.getChildren();
        var elementsCount = elements.count();
        var elementIndex = 0;
        var element = elements.getItem(elementIndex);
        for (; elementIndex < elementsCount; element = elements.getItem(++elementIndex))
        {
            //inFirstRow = inFirstRow && !(element.is('div') && element.hasClass('cke_break'));

            if (!inFirstRow)
            {
                if (show) element.show(); else element.hide();
            }
            inFirstRow = false;
        }
    }

XOLRN.CKEDITOR.initializeCollapser = function (editor) {
    var collapser = (function() {
        try
        {
            // We've HTML: td.cke_top {
            // div.cke_toolbox {span.cke_toolbar, ... }
            // , a.cke_toolbox_collapser }
            var firstToolbarId = editor.toolbox.toolbars[0].id;
            var firstToolbar = CKEDITOR.document.getById(firstToolbarId);
            var toolbox = firstToolbar.getParent();
            var collapser = toolbox.getNext();
            return collapser;
        }
        catch (error) {
            console.error(error);
        }
    })();

    /*
    * Override the default 'toolbarCollapse' command to hide
    * only toolbars in the row two and onwards.
    */
    editor.addCommand( 'toolbarCollapse', {
        readOnly: 1,
        exec: function( editor ) {
            var toolbox = collapser.getPrevious(),
            contents = editor.ui.space( 'contents' ),
            toolboxContainer = toolbox.getParent(),
            contentHeight = parseInt( contents.$.style.height, 10 ),
            previousHeight = toolboxContainer.$.offsetHeight,
            minClass = 'cke_toolbox_collapser_min',
            collapsed = collapser.hasClass( minClass );

            if ( !collapsed ) {
                XOLRN.CKEDITOR.switchVisibilityAfter1stRow(toolbox, false);
                collapser.addClass( minClass );
                collapser.setAttribute( 'title', editor.lang.toolbar.toolbarExpand );
            } else {
                XOLRN.CKEDITOR.switchVisibilityAfter1stRow(toolbox, true);
                collapser.removeClass( minClass );
                collapser.setAttribute( 'title', editor.lang.toolbar.toolbarCollapse );
            }

            // Update collapser symbol.
            collapser.getFirst().setText( collapsed ? '\u25B2' : // BLACK UP-POINTING TRIANGLE
                '\u25C0' ); // BLACK LEFT-POINTING TRIANGLE

            var dy = toolboxContainer.$.offsetHeight - previousHeight;
            contents.setStyle( 'height', ( contentHeight - dy ) + 'px' );

            editor.fire( 'resize' );
        },
        modes: { wysiwyg: 1, source: 1 }
    });
}

XOLRN.CKEDITOR.transformMediaTagToWikiLink = function () {
    var mediaTag = $(this);

    var wikiLinkItemRef = mediaTag.attr('alt');
    var wikiLinkTitle = mediaTag.attr('title') || ' ';
    var wikiLinkParams = {
      "type": mediaTag.attr('data-wiki-link-type'),
      "width": CKEDITOR.tools.cssLength(mediaTag.attr('width')),
      "height": CKEDITOR.tools.cssLength(mediaTag.attr('height')),
      "formeltype": mediaTag.attr('formeltype'),
      "formelsrc": mediaTag.attr('formelsrc'),
      "autoplay": mediaTag.attr('autoplay'),
      "controls": mediaTag.attr('controls'),
      "mimetype": mediaTag.find('cke\\:source').attr('type')
    };
    if (!wikiLinkItemRef || wikiLinkItemRef.charAt(0) != '.') {
        var src_element = $(this);
        var media_type = $(this).prop('tagName').toLowerCase();
        if (media_type == 'img') {
            media_type = 'image';
        } else {
            src_element = src_element.find('source');
        }
        wikiLinkItemRef = './' + media_type + ':' + src_element.attr('src').split('/').pop();
    }

    // Process definitions from the tag's style attribute. We consider
    // these to be "stronger" than the tag attributes width and height
    // and overwrite the latter on conflict. In the end, the video link
    // renders these attributes as CSS style spec.
    if (mediaTag.attr('style')) {
      var re = /([a-zA-Z-]+):([^;]+);?/;
      var styles = mediaTag.attr('style').match(/[a-zA-Z-]+:[^;]+;?/g);
      if (styles) {
        for (i = 0; i < styles.length; i++) {
          var attr = re.exec(styles[i]);
          wikiLinkParams[attr[1]] = attr[2];
        }
      }
    }

    // Transform the wikiLinkParams object into a parameter specification
    // string as required by XoWiki's link,
    // e.g. [[en:page|My Page|-type "video" -style "width: 3px"]]
    var wikiLinkParamsSpec = '';
    for (var param in wikiLinkParams) {
      if (wikiLinkParams[param]) {
        wikiLinkParamsSpec += '-' + param + ' "' + wikiLinkParams[param] + '" ';
      }
    }

    mediaTag.replaceWith('[[' + wikiLinkItemRef +
            '|' + wikiLinkTitle +
            '|' + wikiLinkParamsSpec + ']]');
}

XOLRN.CKEDITOR.transformMediaTagsToWikiLinks = function (form) {
  if ($.type(form) == "string") {
    // a html chunk was given, so replace tags with wikilinks and return the chunk
    var contents = $('<div>'+form+'</div>');
    contents.find('[data-wiki-link-type]').each(XOLRN.CKEDITOR.transformMediaTagToWikiLink);
    contents.find('.protect_from_saving').each(function() {
        $(this).replaceWith($(this).html());
    });
    return contents.html();
  }
  $(form).find('iframe').each(function() {
    $(this).contents().find('img.cke_video').each(function() {
      var realEl = CKEDITOR.instances[$(form).data("ckeditor-instance")].restoreRealElement($(this));
      $(this).replaceWith(realEl.$);
    });
    $(this).contents().find('[data-wiki-link-type]').each(XOLRN.CKEDITOR.transformMediaTagToWikiLink);
  });
  $(form).find('textarea.ckeip').each(function() {
    var contents = $('<div>'+this.value+'</div>');
    contents.find('[data-wiki-link-type]').each(XOLRN.CKEDITOR.transformMediaTagToWikiLink);
    this.value = contents.html();
  });
  return true;
}

XOLRN.CKEDITOR.transformWikiLinksToMediaTags = function (data) {
	var pathname = window.location.pathname;
	var pagename = pathname.substr(pathname.lastIndexOf("/")+1, pathname.length);
	if (!pagename) {
		pagename = $('#name').val();
	}
	pagename = pagename.replace(/:/ig,"%3a");
	var regex_wikilink = new RegExp('\\[\\[./(image|video|audio):([^\\]\\|]*)\\|([^\\]\\|]*)\\|([^\\]]*)\\]\\]', 'g');

	data = data.replace(regex_wikilink, function(wikilink, mediatype, src, title, wikilinkparams) {
		var alt = './' + mediatype + ':' + src;
		src = pagename + '/file:' + src + '?m=download';
		if (mediatype == 'image') {
			return "<img src='"+src+"' alt='"+alt+"' data-wiki-link-type='image' title='"+title+"' wikilinkparams='"+wikilinkparams+"'/>";
		} else {
			return "<"+mediatype+" alt='"+alt+"' data-wiki-link-type='"+mediatype+"' title='"+title+"' wikilinkparams='"+wikilinkparams+"'>"+
				"<source src='"+src+"'/>Your browser does not support the "+mediatype+" tag.</"+mediatype+">";
		}
	});
	var html1 = $('<div>'+data+'</div>');
	html1.find('[data-wiki-link-type]').each(function () {
		var wikilinkparams = $(this).attr('wikilinkparams');
		if (wikilinkparams) {
			var style = '';
			var one_attr = '';
			var re = /-([a-zA-Z-]+) +"([^"]+)"/;
			wikilinkparams = wikilinkparams.match(new RegExp(re,'g'));
			if (wikilinkparams) {
				for (var i = 0; i < wikilinkparams.length; i++) {
					one_attr = re.exec(wikilinkparams[i]);
					if (one_attr) {
						switch (one_attr[1]) {
							case 'mimetype':
								/* mimetype must be added to the <source> tag as parameter type */
								$(this).find('source').attr('type',one_attr[2]);
								break;
							case 'type':
								$(this).attr('data-wiki-link-type',one_attr[2]);
								break;
							case 'formelsrc':
							case 'formeltype':
							case 'autoplay':
							case 'controls':
								$(this).attr(one_attr[1],one_attr[2]);
								break;
							default:
								style += one_attr[1] + ':' + one_attr[2] + '; ';
						}
					}
				}
			}
			$(this).attr('style',style);
			$(this).removeAttr('wikilinkparams');
		}
	});
	return html1.html();
}

//generates a name that is not yet part of the current list
function generateNewName(prefix,currentList,number) {
  var len = currentList.length;
  name = prefix + number;
  for (var i=0; i<len; ++i) {
    if (currentList[i] == name) {
      return generateNewName(prefix,currentList,number+1);
    }
  }
  return name;
}

XOLRN.QTI = XOLRN.QTI || {};
XOLRN.QTI.substQuest = function(form, quest) {
    quest.data('url', form.attr('action'));
    quest.attr('class', form.attr('class'));
    quest.addClass('book-quest');
    quest.html(form.html());
    // initialize sortabel and dragndrop
    if (quest.find('input[name=__action_submit]').length > 0) {
        quest.find('div.orderInteraction').each(function() {
            XOLRN.QTI.init_sortable($(this).attr('id'));
        });
        quest.find('div.associateInteraction,div.gapMatchInteraction.dragndrop').each(function() {
            XOLRN.QTI.init_dragndrop($(this).attr('id'));
        });
    } else {
        quest.find('div.orderInteraction').not('.preview').each(function() {
            XOLRN.QTI.arrange_sortable($(this).attr('id'));
        });
        quest.find('div.associateInteraction,div.gapMatchInteraction.dragndrop').not('.preview').each(function() {
            XOLRN.QTI.arrange_dragndrop($(this).attr('id'));
        });
    }
    if (typeof quest.convert_media == 'function') {
        quest.convert_media();
    }
    quest.find('input[type="submit"]').click(function() {
        // add hidden field to export the name of the clicked submit button via serialize
        quest.append('<input type="hidden" value="" name="' + $(this).attr('name') + '"/>');
        XOLRN.QTI.fetchQuest(quest);
    });
};

XOLRN.QTI.fetchQuest = function(quest) {
    $.post(quest.data('url') + '&master=0', quest.find('input,select,textarea').serialize(), function(data) {
        XOLRN.QTI.substQuest($(data), quest);
    });
};

XOLRN.QTI.arrange_sortable = function(name) {
    var order = $('input[name=' + name + ']').val();
    var orderArr = Array();
    if (order != '') {
        orderArr = order.split(',');
    } else {
        var items = $('#sortable-' + name ).children('li');
        for (var i = 1; i <= items.length; i++) {
            orderArr.push(i);
        }
        orderArr.sort(function() {
            return ( Math.random() < .5 ? -1 : 1 );
        });
        $('input[name=' + name + ']').val(orderArr.join());
    }
    if (orderArr.length) {
        var orderedItems = $.map(orderArr, function (value) {
            return $('#' + name + '_' + value ).get();
        });
        $('#sortable-' + name ).empty().html(orderedItems);
    }
};

XOLRN.QTI.init_sortable = function(name) {
    XOLRN.QTI.arrange_sortable(name);
    $('#sortable-' + name ).sortable({
        create: function(event, ui) {
            order = [];
            $('#sortable-' + name ).children('li').each(function(idx, elm) {
                order.push(elm.id.split('_')[2]);
            });
            $('input[name=' + name + ']').val(order);
        },
        stop: function(event, ui) {
            order = [];
            $('#sortable-' + name ).children('li').each(function(idx, elm) {
                order.push(elm.id.split('_')[2]);
            });
            $('input[name=' + name + ']').val(order);
        }
    });
};

XOLRN.QTI.arrange_dragndrop = function(name) {
    var inputs = $('input[name^=' + name + '][type=hidden]');
    inputs.each(function(index) {
        var inputVal = $(this).val();
        if (!$(this).parent().hasClass('gap') && inputVal == '') {
            $(this).val(',');
            return;
        }
        var valueArr = inputVal.split(',');
        for (key in valueArr) {
            var value = valueArr[key];
            if (value != '') {
                var span = $('.unusedChoiceArea').find('#draggable-' + name + '_' + value ).first();
                if ($(this).parent().hasClass('gap')) {
                    span.appendTo($(this).parent().find('.droppable'));
                } else {
                    span.appendTo($(this).closest('tr').find('.droppable-all:eq(' + key + '):empty'));
                }
            }
        }
    });
};

XOLRN.QTI.init_dragndrop = function(name) {
    XOLRN.QTI.arrange_dragndrop(name);
    $('#' + name + ' .draggable').draggable({
        containment: 'document',
        revert: 'invalid',
        cursor: 'move',
        scope: name
    });
    $('#' + name + ' .droppable').droppable({
        accept: function(el) {
            if ($(this).hasClass('unusedChoiceArea')) {
                return true;
            }
            var old_td_context = el.parent('td');
            var oldRow = old_td_context.length == 0 ? 0 : old_td_context.attr('id').split('_')[2];
            var choiceId = el.attr('id').split('_')[2];
            var idArr = this.id.split('_');
            var newRow = idArr[2];
            var column = idArr[3] - 1;
            var associate = (column == 0) ? 1 : 0;
            var input = $(this).parent().find('input');
            var valueArr = input.val().split(',');
            if ($(this).parent().hasClass('gap')) {
                //we are inside a gapMatchInteraction
                return ( $(this).hasClass('single-value') ? valueArr.toString() == '' : !valueArr.includes(choiceId) );
            }
            //we accept only if the target is empty and
            //we do not find the same choiceID in the associate of the target (unless we move in the same row)
            return (valueArr[column] == '' && (oldRow == newRow || valueArr[associate] != choiceId));
        },
        scope: name,
        activeClass: 'dropit',
        hoverClass: 'drophover',
        tolerance: 'pointer',
        drop: function(event, ui) {
            var idArr;
            var column;
            var input;
            var valueArr;
            var choiceId = $(ui.draggable).attr('id').split('_')[2];
            var from_unused = $(ui.draggable).closest('.unusedChoiceArea').length;
            var to_unused = $(this).closest('.unusedChoiceArea').length;
            var old_context = $(ui.draggable).parent();
            $(this).append($(ui.draggable));
            ui.draggable.css('left', 0);
            ui.draggable.css('top', 0);

            //first we manipulate the old context if we were dragged from a different cell
            if (from_unused == 0) {
                idArr = old_context.attr('id').split('_');
                column = idArr[3];
                input = old_context.parent().find('input');
                valueArr = input.val().split(',');
                if (old_context.parent().hasClass('gap')) {
                    valueArr.splice(valueArr.indexOf(choiceId), 1);
                } else {
                    valueArr[column - 1] = '';
                }
                input.val(valueArr.join(','));
            }

            //then the new
            if (to_unused == 0) {
                idArr = this.id.split('_');
                column = idArr[3];
                input = $(this).parent().find('input');
                valueArr = input.val().split(',');
                if ($(this).parent().hasClass('gap')) {
                    // for empty input fields the array will have one empty value, which we have to remove
                    valueArr = valueArr.filter(Boolean);
                    valueArr.push(choiceId);
                } else {
                    valueArr[column - 1] = choiceId;
                }
                input.val(valueArr.join(','));
            }
        }
    });
};

function open_dialog_for_images(url) {
	xoqti_dialog.load(url);
	xoqti_dialog.dialog("open");
}

//adds a new item to a RepeaptField, by cloning the hidden new template
function new_item (me) {
  var repeatable = $(me).closest('.form-widget-repeatable');
  var r_list = repeatable.find(".repeatable-item-list");
  var new_name = generateNewName("item_",r_list.val().split(" "),1);
  var template = repeatable.find('.repeat-field-new-item');
  var clone = template.clone(true).attr("id",template.attr('id')+new_name).removeClass('repeat-field-new-item').addClass('form-item-wrapper').addClass('form-item-wrapper-repeated');
  
  var replace_function = function(i, val) { return val.replace(/__item__/,new_name) };
  clone.find('[id]').attr('id', replace_function);
  clone.find('[name]').attr('name', replace_function);
  clone.find('[class]').attr('class', replace_function);
  clone.find('[onclick]').attr('onclick', replace_function);
  clone.find('[disabled]').removeAttr('disabled');
  clone.insertBefore(template);

  r_list.val(r_list.val()+" "+new_name);
  return clone;
}
function new_item_ (me) {
  $("#ctxm").empty();
  var repeatable = me.closest('.form-widget-repeatable');
  var r_list = repeatable.find(".repeatable-item-list");
  var new_name = generateNewName("item_",r_list.val().split(" "),1);
  var template = repeatable.find('.repeat-field-new-item');
  var new_id = template.attr('id').replace(/__item__/,new_name);
  var clone = template.clone(true).attr("id",new_id).removeClass('repeat-field-new-item').addClass('form-item-wrapper').addClass('form-item-wrapper-repeated');
  //if ($(me).parent().parent().hasClass('last-item')) {
  //    $(me).parent().parent().removeClass('last-item');
  //}
  $(me).parent().parent().parent().find('.form-item-wrapper').removeClass('last-item');
  clone.addClass('last-item');
  clone.attr('class',clone.attr('class').replace(/__item__/,new_name));
  clone.html(clone.html().replace(/__item__/g,new_name));
  //clone.find('[id]').attr('id', function(i, val) { return val.replace(/__item__/,new_name) });
  //clone.find('[name]').attr('name', function(i, val) { return val.replace(/__item__/,new_name) });
  clone.find('[disabled]').removeAttr('disabled');
  clone.insertBefore(template);

  r_list.val(r_list.val()+" "+new_name);
  return clone;
}
function move (me,mode) {
    $("#ctxm").empty();
    var me_item = $(me+'.form-item-wrapper');
    var me_value = me_item.find('textarea[id$=text],input[id$=text]').val();
    //for associate interaction
    var me_value1 = me_item.find('textarea[id$=text1]').val();
    var me_value2 = me_item.find('textarea[id$=text2]').val();
    var me_feedback = me_item.find('textarea[id$=feedback]').val();
    var me_correct = me_item.find('input[name$=correct]').val();
    var me_item_ctx_menu = me_item.find('div.ctxmenu').html();
    var valid_mode = 0;
    if (mode=='up') {
        valid_mode = 1;
        var other_item = $(me+'.form-item-wrapper').prev();
    }
    if (mode=='down') {
        valid_mode = 1;
        var other_item = $(me+'.form-item-wrapper').next();
    }
    if (!other_item.hasClass('form-item-wrapper')) {
        return false;
    }
    if (valid_mode==1) {
        var other_value = other_item.find('textarea[id$=text],input[id$=text]').val();
        //for associate interaction
        var other_value1 = other_item.find('textarea[id$=text1]').val();
        var other_value2 = other_item.find('textarea[id$=text2]').val();
        var other_feedback = other_item.find('textarea[id$=feedback]').val();
        var other_correct = other_item.find('input[name$=correct]').val();
        var other_item_ctx_menu = other_item.find('div.ctxmenu').html();
        other_item.find('textarea[id$=text],input[id$=text]').val(me_value);
        other_item.find('textarea[id$=text]').parent().next().html(me_value)
        //for associate interaction
        other_item.find('textarea[id$=text1]').val(me_value1);
        other_item.find('textarea[id$=text1]').parent().next().html(me_value1);
        other_item.find('textarea[id$=text2]').val(me_value2);
        other_item.find('textarea[id$=text2]').parent().next().html(me_value2);
        other_item.find('textarea[id$=feedback]').val(me_feedback);
        other_item.find('textarea[id$=feedback]').parent().next().html((me_feedback));
        if (typeof(me_feedback) != 'undefined' && me_feedback.trim().replace('&nbsp;','') != '') {
            other_item.find('textarea[id$=feedback]').parent().parent().parent().show();
        }
        other_item.find('input[name$=correct]').val(me_correct);
        //other_item.find('div.ctxmenu_popup').html(me_item_ctx_menu);
        if (me_correct=='t') {
             other_item.find('img.img_boolean_correct').attr('src','/resources/xolrn/icons/check_richtig.png');
        } else {
             other_item.find('img.img_boolean_correct').attr('src','/resources/xolrn/icons/check_falsch.png');
        }
        me_item.find('textarea[id$=text],input[id$=text]').val(other_value);
        me_item.find('textarea[id$=text]').parent().next().html(other_value)
        //for associate interaction
        me_item.find('textarea[id$=text1]').val(other_value1);
        me_item.find('textarea[id$=text1]').parent().next().html(other_value1)
        me_item.find('textarea[id$=text2]').val(other_value2);
        me_item.find('textarea[id$=text2]').parent().next().html(other_value2)
        me_item.find('textarea[id$=feedback]').val(other_feedback);
        me_item.find('textarea[id$=feedback]').parent().next().html((other_feedback));
        me_item.find('input[name$=correct]').val(other_correct);
        //me_item.find('div.ctxmenu_popup').html(other_item_ctx_menu);
        if (other_correct=='t') {
             me_item.find('img.img_boolean_correct').attr('src','/resources/xolrn/icons/check_richtig.png');
        } else {
             me_item.find('img.img_boolean_correct').attr('src','/resources/xolrn/icons/check_falsch.png');
        }
    }

}

function delete_item (me) {
  $("#ctxm").empty();
  var form_item = $(me).closest(".form-item-wrapper");
  var form_item_id = form_item.attr("id");
  var form_item_name = form_item_id.match(/[^\.]+$/);
  var r_list = form_item.parent().find(".repeatable-item-list");
  var expr = new RegExp("\\b"+form_item_name+"\\b");
  r_list.val(r_list.val().replace(expr, ""));
  form_item.remove();
}

function toggle_img_boolean (me,t_img_url,f_img_url) {
 var input = $(me).next();
 var state = input.val()== "t";
 if (state) {
   input.val('f');
   $(me).attr('src',f_img_url);
 } else {
   input.val('t');
   $(me).attr('src',t_img_url);
 }
}
function toggle_fixed_side (me) {
 var input = $(me).next();
 var state = input.val()== "t";
 if (state) {
   //left side is now fixed. disable max associations!
   $(".maxAssociations input").attr('disabled','disabled');
   $(".maxAssociations input").val('');
 } else {
   //left side is now variable. enable max associations!
   $(".maxAssociations input").removeAttr('disabled');
 }
}

$(document).on('dialogopen', '#xoqti_dialog', function() {
  initialize_gapMatchInteraction_fields_toggle();
  $(this).find('#question_dialog').on('click', 'a', function() {
    setTimeout(function() {
      initialize_gapMatchInteraction_fields_toggle();
    }, 300);
  });
});
function initialize_gapMatchInteraction_fields_toggle() {
  if ($('#xoqti_dialog').find('.gapMatchInteraction').length) {
    toggle_gapMatchInteraction_fields();
    $('.gapMatchInteraction').on('change', 'select', function() {
      toggle_gapMatchInteraction_fields();
    });
  }
}
function toggle_gapMatchInteraction_fields() {
  var displayType_select = $('select[id$="displayType"]');
  var matchType_select = $('select[id$="matchType"]');
  var matchType_wrapper = $('.form-item-wrapper[id$="matchType"]');
  var scoring_wrapper = $('.form-item-wrapper[id$="scoring"]');
  if (displayType_select.val() == 'dragndrop') {
    matchType_wrapper.show();
  } else {
    matchType_wrapper.hide();
  }
  if (matchType_select.is(':visible') && matchType_select.val() == 'all') {
    scoring_wrapper.show();
  } else {
    scoring_wrapper.hide();
  }
}

function acs_ListFindInput() {
  if (document.getElementsByTagName) {
    return document.getElementsByTagName('input');
  } else if (document.all) {
    return document.all.tags('input');
  }
  return false;
}

function acs_ListCheckAll(listName, checkP) {
  var Obj, Type, Name, Id;
  var Controls = acs_ListFindInput(); if (!Controls) { return; }
  // Regexp to find name of controls
  var re = new RegExp('^' + listName + '..+');

  checkP = checkP ? true : false;

  for (var i = 0; i < Controls.length; i++) {
    Obj = Controls[i];
    Type = Obj.type ? Obj.type : false;
    Name = Obj.name ? Obj.name : false;
    Id = Obj.id ? Obj.id : false;

    if (!Type || !Name || !Id) { continue; }

    if (Type == "checkbox" && re.exec(Id)) {
      Obj.checked = checkP;
    }
  }
}

//Jquery shuffle plugin
//from http://yelotofu.com/labs/jquery/snippets/shuffle/jquery.shuffle.js
(function($){
	$.fn.shuffle = function() {
		return this.each(function(){
		 	var em = $(this).find('option:empty');
			$(this).find('option:empty').remove();
			var items = $(this).children().clone(true);
			items = $.shuffle(items);
			$.merge(em, items);
			return (items.length) ? $(this).html(em) : this;
		});
	}
	
	$.shuffle = function(arr) {
		for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x);
		return arr;
	}
	
})(jQuery);

function prompt_and_link(auff, title, link, type, empty, auto){
	var html = auff+'<br/><br/><div style="text-align: center; width: 100%"><input id="new_title" type="text" style="width: 90%" /></div>';
	if (type == "test") {
		html += ' \
			<br/><input id="content_empty" type="radio" name="content" value="empty" checked="checked" /> \
			<label for="content_empty">'+empty+'</label> \
			<br/><input id="content_auto" type="radio" name="content" value="auto" /> \
			<label for="content_auto">'+auto+'</label> \
		';
	}
	$('#loading').html(html);
        $('#loading').dialog({
            title: title,
            buttons: '',
            minWidth: 300,
            minHeight: 100,
            zIndex: 300,
            closeText: 'X',
            modal: true,
            buttons: [{
		    id: 'new_object_submit_button',
		    text: 'OK',
		    click: function () {
			// Get the position of the return_url ('return_url=' takes 11 chars -> increase the index by 11)
			var index = link.search(/return_url/) + 11;
            var orig_link = link;
            var orig_len = orig_link.length;
            var return_url = link.substring(index);
            return_url = return_url.split("&")[0];
            var rl_len = return_url.length;
            //return_url = encodeURIComponent(return_url);
            var new_title = encodeURIComponent($('#new_title').val());
            link = link.substring(0,index)+return_url;
            if(index+rl_len+1<orig_len) {
                link = link+orig_link.substring(index+rl_len);
            }
			link += "&title="+new_title;
			if (type == "test") { link += "&content="+$('[name="content"]:checked').val(); }
			window.location.href=link;
			$(this).dialog('close');
		    }
		}, {
		    text: 'Cancel',
		    click: function () {
			$(this).dialog('close');
		    }
		}]
        });
	$('#new_title').keyup(function(event){
		if (event.keyCode == 13) {
			$('#new_object_submit_button').click();
		}
	});
};



function loading_popup(action, message) {
    if (action == 'show') {
    	    var html = '<center><img src="/resources/xolrn/loading.gif" /></center>';
        $('#loading').html(html);
        $('#loading').dialog({
            title: message,
            buttons: '',
            minWidth: 100,
            minHeight: 40,
            zIndex: 10,
            closeText: 'X',
            modal: true
        });
    } else {
        $('#loading').dialog('close');
    }
}

function loading_popup_redirect(action, message, url, confirm) {
    if (action == 'show') {
        var html = '';
        var buttons = '';
        var open = function() {
            $('.ui-dialog-titlebar-close,.ui-dialog-buttonpane').hide();
            $(this).html('<center><img src="/resources/xolrn/loading.gif" /></center>');
            window.location.href=url;
        }
        if (confirm) {
            html = '<center>'+confirm+'</center>'
            buttons = [{
                text: 'OK',
                click: open
            }, {
                text: 'Cancel',
                click: function() {
                    $(this).dialog('close');
                }
            }];
            open = '';
        }

        $('#loading').html(html);
        $('#loading').dialog({
            title: message,
            buttons: buttons,
            minWidth: 100,
            minHeight: 40,
            zIndex: 10,
            closeText: 'X',
            modal: true,
            open: open
        });
    } else {
        $('#loading').dialog('close');
    }
}

$(document).ready(function() {
    if (typeof book_admin_p != "undefined") {
	// enable handlers only if we display an ibook_v2
	if ("onhashchange" in window) {
		window.onhashchange = function () {
			BOOK.goto_page(window.location.hash.substr(1));
		}
	} else {
		var current_bookpage = window.location.hash;
		window.setInterval(function () {
			if (window.location.hash != current_bookpage) {
				current_bookpage = window.location.hash;
				BOOK.goto_page(current_bookpage.substr(1));
			}
		}, 100);
	}
	if (book_admin_p == 1) {
		$('#ibook-toc').addClass('deactivateable');
		$('#ibook-toc').on('click', 'ins.jstree-icon', function(event) {
			var object = $(this).parent();
			var bookpage = $('#bookpage'+object.data('id').substr(4));
			var status = ( object.hasClass('expired') ? 'ready' : 'expired' );
			window.location=parent_url+'/'+bookpage.attr('name')+'?m=set-publish-status&status='+status+'&return_url='+return_url+location.hash;
			return false;
		});

		CKEDITOR.disableAutoInline = true;
		var editable_classes = [
			'.book-title',
			'.bookpage-title .plain-title',
			'.emmbedded-book-page-wrapper > h3',
			'.emmbedded-book-page-wrapper .description',
			'.emmbedded-book-page-wrapper .xolrn-page-wrapper'
		];
		$(document).on('dblclick', editable_classes.toString(), function() {
			start_inline_editor(this);
		});
		$(document).on('dblclick', '.photo-show', function() {
			if (!$(this).hasClass('above-overlay')) {
				var item_id = $(this).parent().attr('id').substr(3);
				photo_editing_mode(item_id, 1);
			}
		});
	}
    }
});

function change_page (next) {
	//var count = $('.ibook_item[item_id="'+$('#ibook_current_page').val()+'"]').attr('count');
	var count = $('#bookpage'+$('#ibook_current_page').val()).attr('count');
	if (next) {
		count++;
	} else {
		count--;
	}
	var ibook_page = $('.ibook_item[count="'+count+'"]');
	if (ibook_page.length) {
		BOOK.link_to_page(ibook_page.attr('item_id'));
	}
}
function lock_toc() {
	$('#burger-menu').addClass('selected');
	$('#ibook-toc-hdr .lock').hide();
	$('#ibook-toc-hdr .unlock').show();
	BOOK.calc_nav();
	sessionStorage['lock_book_toc_'+book_id] = 1;
}
function unlock_toc() {
	$('#burger-menu').removeClass('selected');
	$('#ibook-toc-hdr .unlock').hide();
	$('#ibook-toc-hdr .lock').show();
	BOOK.calc_nav();
	sessionStorage['lock_book_toc_'+book_id] = 0;
}
function new_book_item (item_type, page_item) {
	var page = $('#bookpage'+$('#ibook_current_page').val());
	if (page_item) {
		var attr = 'name';
		return_url += location.hash;
	} else {
		var attr = 'parent';
		item_type += '&after=' + ( $('#startpage').is(':visible') ? 0 : page.data('order') );
		return_url += '#current';
	}
	window.location = parent_url + '/' + page.attr(attr) + '?m=' + item_type + '&return_url=' + return_url;
}
function paste_into_book () {
	var page = $('#bookpage'+$('#ibook_current_page').val());
	window.location = parent_url + '/' + page.attr('name') + '?m=action-paste&ibook_p=1&return_url=' + return_url + location.hash;
}
function xolrn_load_child_summary_dialog(e, item_id, url, title) {
    (e.preventDefault) ? e.preventDefault() : e.returnValue = false;
    $("#ctxm").empty();
    $("#dialog_"+item_id).html("<center><img src='/resources/xolrn/loading.gif' /></center>");
    $("#dialog_"+item_id).load(url).dialog({
        title: title,
        minWidth: 380
    });
    return false;
}
function validatePercentage(p_val) {
    if ((undefined === p_val) || (null === p_val)) {
        return false;
    }
    if(isNaN(p_val)){
        return false;
    }
    p_val = p_val - 0;
    if(p_val < 0 || p_val > 100) {
        return false;
    }
    return true;
}

function update_interaction_score(id,e) {
    var score_el = $("#interaction_score\\("+id+"\\)");
    var err_el = $("#interaction_score_error\\("+id+"\\)");
    var saved_el = $("#interaction_score_saved\\("+id+"\\)");
    var unsaved_el = $("#interaction_score_unsaved\\("+id+"\\)");
    saved_el.hide();
    unsaved_el.show();
    var this_score = score_el.val();
    this_score = this_score.replace(",",".");
    if(validatePercentage(this_score)) {
        err_el.hide();
    } else {
        err_el.show();
    }
    if (e.keyCode == 13) {
        submit_interaction_score(id);
    }
}
function submit_interaction_score(id) {
    //get value from id
    var score_el = $("#interaction_score\\("+id+"\\)");
    var err_el = $("#interaction_score_error\\("+id+"\\)");
    var saved_el = $("#interaction_score_saved\\("+id+"\\)");
    var unsaved_el = $("#interaction_score_unsaved\\("+id+"\\)");
    var this_score = score_el.val();
    var this_weight = $("#interaction_weight\\("+id+"\\)").attr("value");
    this_score = this_score.replace(",",".");
    //check, if integer and between 0 and 100
    if(validatePercentage(this_score)) {
        this_score = this_score / 100;
        var interaction_score = this_score + " " + this_weight;
        var post_params = {};
        post_params["m"]="save-score";
        post_params["interaction_id"]=id;
        post_params["interaction_score"]=interaction_score;
        $.ajax({
          type: "GET",
          url: window.location.pathname,
          data: post_params,
          dataType: "text",
          success: function(revision_id) {
            unsaved_el.hide();
            err_el.hide();
            saved_el.show();
            $("div.feedback").hide();
            $("div#"+id).attr("title","");
            // update revision-id to prevent user message that the workflow has been modified by someone else
            $("[name=__current_revision_id]").val(revision_id);
          }
        });
        return true;
    } else {
        saved_el.hide();
        unsaved_el.show();
        err_el.show();
        return false;
    }
}

function noSubmitCheck(e){
    if (e.which == 13) {
        e.preventDefault();
    }
}

var animation_running=1;

function print_book_content() {
  $("<link/>", {id:"print_css", rel:"stylesheet", type:"text/css", href:"/resources/xolrn/print.css"}).appendTo("head");
  animation_running=0;
  $("div.youtube iframe").each(function() {
    $(this).hide().after("<img class='youtube-preview0' src='https://img.youtube.com/vi/"+$(this).attr("id")+"/0.jpg' />");
  });
  timer = window.setTimeout(function(){
    window.print();
  }, 100);
};

function print_book_page(notify) {
  if (notify){
    var current_page = $(".ibook_item:visible");
    if (current_page.length) {
      //prevent notification if only the start page was printed
      print_notification(current_page.attr("data-order"), current_page.attr("item_id"), "print_book_page");
    }
  }
  print_book_content();
};

function print_book_pages(pages) {
  var with_ajax = 0;
  pages.not('.loaded').each(function() {
    with_ajax = 1;
    render_current_page($(this),$(this).attr('item_id'));
  });
  pages.show();
  pages.not(':first').prepend("<hr class='pagebreak' />");
  if (with_ajax) {
    $(document).on("ajaxStop", function(e){ print_book_content(); });
  } else {
    print_book_content();
  };
};

function print_book(notify) {
  $('#ibook').show();
  if (notify){
    print_notification("", 0, "print_book");
  }
  $('#ibook-toc-hdr, #ibook-toc').appendTo('#printable-toc');
  print_book_pages($("#startpage, #printable-toc, .ibook_item"));
};

function print_book_chapter(notify) {
  var chapter = $('.ibook_item:visible').attr('data-order').split('.')[0];
  var chapter_page = $('.ibook_item[data-order="' + chapter + '"]');
  var the_pages = $('.ibook_item[data-order^="' + chapter + '."]').add(chapter_page);
  if (notify){
    print_notification(chapter, chapter_page.attr('item_id'), "print_book_chapter");
  }
  print_book_pages(the_pages);
};

function backFromPrint(){
  $(document).off("ajaxStop");
  $("img.youtube-preview0").remove();$("div.youtube iframe").show();
  $("#print_css").attr("disabled", "disabled").remove(); //disabled for IE
  $("hr.pagebreak").remove();
  $('#printable-toc > div').appendTo('#burger-content > li:last');
  animation_running=1;
  BOOK.reInit();
};

$(document).ready(function() {
    $('.orderby').on('click', function() {
	if ($(this).hasClass('selected')) { return false; }
	var orderby = $(this).attr('data-value').split(',');
	var thumb_container = $('.thumb-view');
	if (thumb_container.length > 0) {
		// Thumbnail sort
		thumb_container.each(function(index, container) {
			$(container).children('.thumbnail').sort(sortThumbnails(orderby)).appendTo(container);
		});
		$(this).add('.orderby.selected').toggleClass('selected');
	} else {
		// Table sort
		$('th.yui-dt-col-'+orderby[0]+' span.yui-dt-label').trigger('click');
		$(this).addClass('selected');
	}
    });
    $('th.yui-dt-sortable').on('click', syncSelectedOrder);
});
function sortThumbnails(orderby) {
    return function(a, b) {
	a = $(a).attr('data-'+orderby[0]).toUpperCase();
	b = $(b).attr('data-'+orderby[0]).toUpperCase();
	return ( a > b ? 1 : -1 ) * ( orderby[1] == 'asc' ? 1 : -1 );
    }
}
function syncSelectedOrder() {
    $('.orderby.selected').removeClass('selected');
    if ($('.yui-dt-data').length == 1) {
	// only select sort order in menu, if the changed data table is the only one
	var sort_order = $(this).attr('id').split('-')[3];
	$('.orderby[data-value^="'+sort_order+'"]').addClass('selected');
    }
}

$(document).ready(function() {
    $('#childres_containter').on('click', '.thumb-checkbox', function() {
	var checkbox = $(this).find('input');
	checkbox.prop('checked', !checkbox.prop('checked'));
	$(this).toggleClass('checked');
    });
    $('#childres_containter').on('click', '.check-all', function() {
	$(this).toggleClass('checked');
	var checked = $(this).hasClass('checked');
	var checkboxes = $(this).parent().find('.thumb-checkbox');
	checkboxes.find('input').prop('checked', checked);
	if (checked) {
	    checkboxes.addClass('checked');
	} else {
	    checkboxes.removeClass('checked');
	}
    });
});
function bulk_action(action, confirm_text) {
    if (typeof confirm_text != 'undefined' && !confirm(confirm_text)) {
	return;
    }
    var object_ids = new Array();
    $('input[name=object_ids]:checked').each(function() {
	object_ids.push($(this).val());
    });
    if (!object_ids.length) return;
    var url = $('.bulk_menu').attr('data-url');
    window.location.href = url+'?bulk-'+action+'=1&object_ids='+object_ids.join('+')+'&return_url='+encodeURIComponent(location.pathname + location.search);
}

function init_dropzone(message, remove_file, cancel_upload, cancel_upload_confirm, file_too_big, max_filesize) {
    Dropzone.options.importFiles = {
	paramName: 'upload_file',
	maxFilesize: max_filesize,
	addRemoveLinks: true,
	dictDefaultMessage: message,
	dictRemoveFile: remove_file,
	dictCancelUpload: cancel_upload,
	dictCancelUploadConfirmation: cancel_upload_confirm,
	dictFileTooBig: file_too_big,
	renameFilename: function(filename) {
	    return filename.replace(/;/g,'');
	},
	init: function() {
	    this.on('addedfile', function(file) {
		$('#folder_hint').hide();
	    });
	    this.on('removedfile', function(file) {
		if ($(file.previewElement).hasClass('dz-success')) {
		    var files = $('input[name=uploaded_files]').val().split(',');
		    files.splice(files.indexOf(file.id),1);
		    $('input[name=uploaded_files]').val(files);
		}
	    });
	    this.on('success', function(file, response) {
		$(file.previewElement).find('[data-dz-name]').text(response.name);
		file.id = response.id;
		var files = $('input[name=uploaded_files]').val().split(',');
		if (files.toString() == '') { files.pop(); }
		files.push(file.id);
		$('input[name=uploaded_files]').val(files);
	    });
	    this.on('error', function(file) {
		if (file.size == 0 && file.type == '') {
		    this.removeFile(file);
		    $('#folder_hint').show();
		}
	    });
	}
    };
    if (!$('.dropzone')[0].dropzone) {
        new Dropzone('.dropzone');
    }
}
$(document).ready(function() {
    $('#childres_containter').on('dragenter', '.child-resources, .photo-container, .JSLgallery', function() {
	$('.dropzone').show();
    });
    $('#childres_containter').on('touchstart', 'a.thumbnail', function() {
        window.location.href = $(this).attr('href');
    });
});

function photos_order_update(container){
  var a = $(container).sortable("toArray");
  a = jQuery.map(a,function(e,i){return(e.slice(6))});
  $.post("?m=photos_order_update", {'order[]':a});
};

function render_current_page(page,page_id) {
  if (!page.hasClass('preloaded')) {
    page.addClass('preloaded');
    $.get(window.location.pathname, {"m":"render_current_page", "page_item_id":page_id}, function(data) {
      var title = page.find('h2');
      title.after(page.find('.symlink_icon'),data);
      page.find('.bookpage-menu.ctxmenu').appendTo(title);
      if (page.next().length) {
        page.find('.next_page_link_container a').text(page.next().find('.bookpage-title').text());
        page.find('.next_page_link_container').show();
      }
      page.addClass('loaded');

      if (typeof page.convert_media == 'function') { page.convert_media(); }
      page.find('div.book-quest').each(function() {
        XOLRN.QTI.fetchQuest($(this));
      });
      if ($('#show_comments').val() == 1) { page.find('.book_comments').show(); }
      page.find('.emmbedded-book-page-wrapper').each(function() {
	if ($(this).find('.comment').length > 0) { $(this).find('.commentmenu').addClass('not_empty'); }
	$(this).data('name', page.attr('name') + '/' + $(this).data('name'));
      });
      var url_regexp = RegExp('[?&]open_comments=([0-9]+)').exec(window.location.search);
      if (url_regexp != null) {
	var comments = $('#el_'+url_regexp[1]).find('.book_comments').show();
	$('html, body').animate({ scrollTop: comments.offset().top - $('#ibook-menu').height() }, 1000);
      }
      var search_result_id = $('#search_result_id').val();
      if (search_result_id) {
	goto_search_result(search_result_id);
      }
      BOOK.calc_content();
    }, "html").fail(function() {
      page.find('h2').after('<span class="server_error">Server Error!</span>');
    });
  }
}

function IBook(page_id) {
  var me = this;
  var pages = $("#my_pages div.ibook_item");
  var pagesi = pages.map(function(){return $(this).attr("item_id");}).get();
  var pagecount = pagesi.length;
  
  var current_page_id = -1;
  var current_pagei, current_page;
  var timer = null;
  var loading_page = null;
  var BAR;
  
  this.reInit = function(){
    BAR.init();
    this.show_currentpage();
    BAR.render();
  };
  
  this.link_to_page = function(page_hash){
    if(history.pushState) {
      history.pushState(null, null, '#'+page_hash);
      me.goto_page(page_hash);
    } else {
      location.hash = '#'+page_hash;
    }
  };
  
  this.goto_page = function(page_id){
    $('video').each(function() { this.pause() });
    me.show_page(page_id);
    BAR.render();
    me.save_current_page();
  };
  
  this.update_tax = function(){
    if (current_page_id > 0) {
      $("#ibook-toc a.current_page").removeClass("current_page");
      $("#ibook-toc a[data-id='node"+current_page_id+"']").addClass("current_page");
    };
  };

  this.calc_nav = function(){
    var margin = 0;
    var space = $(window).width() - $('#ibook-all').width();
    if ($('#burger-menu').hasClass('selected')) {
      // table of contents is locked -> move everything to the right
      var toc_width = $('#burger-content').width();
      var max_margin = Math.max(space - 3 * $('#nav-prev svg').width(), 0);
      margin = Math.min(toc_width, max_margin);
    }
    $('#ibook-bg').css('margin-left', margin);
    $('#nav-prev').css('left', margin);
    $('#nav-prev, #nav-next').width((space - margin) / 2);
  };

  this.calc_content = function(){
    var content_width = $('#my_pages').width() - 60;
    $('.youtube iframe').height(content_width * 480 / 640);
    $('.JSLgallery').each(function() {
      var old_width = $(this).attr('width');
      var max_width = $(this).attr('max-width');
      if (old_width > content_width || max_width != undefined) {
        if (max_width == undefined) {
          // save the old width in attribute max-width
          max_width = old_width;
        }
        var width = Math.min(content_width,max_width);
        var height = width * $(this).attr('height') / old_width;
        $(this).attr({ 'width': width, 'height': height, 'max-width': max_width });
        $(this).find('.JSLmask').width(width).height(height);
        $(this).find('img').each(function() {
          var img_width = $(this).attr('width') * width / old_width;
          var img_height = $(this).attr('height') * width / old_width;
          var margin_top = (height - img_height) / 2;
          var margin_left = (width - img_width) / 2;
          $(this).attr({ 'width': img_width, 'height': img_height, 'data-top': margin_top, 'data-left': margin_left });
          $(this).css({ 'margin-top': margin_top, 'margin-left': margin_left });
        });
      }
    });
  }

//redraw after print
  this.show_currentpage = function(){
    if (current_page.hasClass('inactive')) {
      $('#ibook-all').addClass('inactive');
    } else {
      $('#ibook-all').removeClass('inactive');
    };

    if (current_page_id < 0) {
      $('#ibook, #ibook-menu td.new-part, .paste-clipboard, .print_book_chapter').hide();
      $('#startpage, #ibook-menu td.disabled').show();
    } else {
      $('#ibook, #ibook-menu td.new-part, .paste-clipboard, .print_book_chapter').removeAttr('style');
      $('#startpage, #ibook-menu td.disabled').hide();

      if (current_page_id == pagesi[0]) {
        $('#nav-prev').addClass('inactive');
      } else {
        $('#nav-prev').removeClass('inactive');
      }
      if (current_page_id == pagesi[pagesi.length-1]) {
        $('#nav-next').addClass('inactive');
      } else {
        $('#nav-next').removeClass('inactive');
      }

      $('.ibook_item').hide();
      current_page.show();
      me.update_tax();
    };
  };
  
  this.show_page = function(page_id){
    if (page_id == 'init') {
      // when no hash is given -> go to start page if activated or to last visited page
      page_id = ( $('#startpage.ready').length ? 'start' : 'current' );
    }
    var i = $.inArray(page_id, pagesi);
    if (i == -1) { //given page does not exist, maybe it is one of: 'start', 'current' or 'first'
      if (page_id == 'current') { //go to last visited page
        location.hash = '#'+$('#ibook_current_page').val();
        return false;
      } else if (page_id == 'first' || !$('#startpage').length) { //go to first page (also if no start page available)
        location.hash = '#'+pagesi[0];
        return false;
      }
      // go to start page (also if given page is not available any more)
      current_page_id = -1;
      current_page = $('#startpage');
      return me.show_currentpage();
    };

    if (page_id == current_page_id) return false;
    current_page_id = page_id;
    current_pagei = i;
    current_page = $(pages[i]);
    $('#ibook_current_page').val(current_page_id);
    
    timer = window.setTimeout(function(){
      if (!current_page.hasClass('loaded') && loading_page != current_page) {
         window.clearTimeout(timer);
         loading_page = current_page;
         timer = window.setTimeout(function(){
           render_current_page(current_page,current_page_id);
         }, 100);
      };
    }, 100); 
    
    var page_count = '-';
    var active_pages = pages.not('.inactive');
    for (var i = 0; i < active_pages.length; i++) {
      if (active_pages[i].id == 'bookpage'+current_page_id) {
        page_count = i+1;
        break;
      }
    }
    page_count += '/' + active_pages.length;
    $('#ibook-page-count').text(page_count);

    me.show_currentpage();
    $(window).scrollTop(0);
    var search_result_id = $('#search_result_id').val();
    if(search_result_id && current_page.hasClass('loaded')) {
        goto_search_result(search_result_id);
    }
  };
  
  this.save_current_page = function(){
    if (current_page_id > 0) {
      $.post(window.location.pathname, {"m":"save_current_page", "page_item_id":current_page_id});
    }
  };
  
  this.Bar = function(){
    var Bar = this;
    
    var bar = $("div.bar1");
    var slider = $("div.book_bar2");
    var minsize = slider.width();
    var barwidth, pagespan, handlesize, slider_max;
    
    this.render = function(){
      var left = current_pagei*pagespan;
      if (left>slider_max) { left = slider_max; }
      slider.css({"width":handlesize, "left":left});
      //slider.html(current_page.data("order"));
    };
    
    this.init = function(){
      if (bar.is(':visible')) {
        barwidth = bar.width();
      } else {
        $('#ibook').show();
        barwidth = bar.width();
        $('#ibook').hide();
      }
      pagespan = barwidth/pagecount;
      handlesize = pagespan>minsize ? pagespan : minsize ;
      slider_max = barwidth-handlesize;
      if (pagespan<handlesize) {
        pagespan = slider_max/(pagecount-1);
      }
    };
    
    this.init();
    
    this.get_current = function(position){
      if (pagespan<handlesize) {
        position -= (handlesize-pagespan)/2;
      }
      var curr = Math.floor(position/pagespan);
      if (curr<0) { curr = 0; }
      if (curr>pagecount-1) { curr = pagecount-1; }
      return curr;
    }

    slider.draggable({axis:"x", containment:"parent", cursor:"pointer", drag: function(event, ui){
      var curr = Bar.get_current(ui.position.left+handlesize/2);
      me.show_page(pagesi[curr]);
      //slider.html(current_page.data("order"));
    }, stop: function( event, ui ){
      var curr = Bar.get_current(ui.position.left+handlesize/2);
      current_pagei = curr;
      current_page_id = pagesi[curr];
      Bar.render();
      me.link_to_page(current_page_id);
    }});
    
    bar.click(function(e){
      var curr = Bar.get_current(e.pageX - bar.offset().left);
      me.link_to_page(pagesi[curr]);
    });
    
  };
  
  BAR = new this.Bar();
  this.show_page(page_id);
  BAR.render();
  setTimeout(function(){me.update_tax();},200);
  this.calc_nav();
  $('#ibook-all .ibook_v2').css('opacity','1');

  // let continue button point to first page if saved page was deleted
  if (!$('#bookpage'+$('#ibook_current_page').val()).length) {
    $('#ibook_current_page').val($('.ibook_item:first').attr('item_id'));
  }

  var reload;
  $(window).bind('orientationchange resize', function(e) {
    if (e.type == 'orientationchange' || $(window).width() < full_menu_width == $('#ibook-menu').hasClass('full')) {
      // reload on orientation change and if we have the full menu on a small window or the compact menu on a large window
      $('#ibook-content').hide();
      if (reload) { clearTimeout(reload); }
      reload = setTimeout(function() { window.location.reload(true); }, 100);
    }
    BAR.init();
    BAR.render();
    me.calc_nav();
    me.calc_content();
  });
  
  var touchpointx = null;
  var touchpointy = null;
  
  $("#ibook").on("touchstart", function(e){
    touchpointx = e.originalEvent.touches[0].screenX;
    touchpointy = e.originalEvent.touches[0].screenY;
  });

  $("#ibook").on("touchmove", function(e){
    if (!touchpointy || DRAGFLAG) { return; }
    if (!touchpointx) {e.preventDefault(); return;}
    var diffx = touchpointx - e.originalEvent.touches[0].screenX;
    if (diffx > 70) { touchpointx = null; change_page(1); e.preventDefault(); return;}
    if (diffx < -70) { touchpointx = null; change_page(0); e.preventDefault(); return;}
    var diffy = touchpointy - e.originalEvent.touches[0].screenY;
    if (Math.abs(diffy) > Math.abs(diffx)) { touchpointy = null; return;}
    e.preventDefault();
  });
  
  $("#ibook").on("touchend", function(e){ touchpointx = null; });
  $("#ibook").on("touchCancel", function(e){ touchpointx = null; });

};

function print_notification(data_order, page_id, extend) {
    $.get(window.location.pathname, {"m":"print_notification", "book_id":book_id, "data_order":data_order, "page_id":page_id, "extend":extend});
};

function goto_search_result(search_result_id) {
  search_timer = window.setTimeout(function(){
    search_result = $("#el_"+search_result_id);
    highlight_search_text($("#search_result_text").val());
    $('html, body').animate({ scrollTop: search_result.offset().top - $('#ibook-menu').height() }, 250);
    $("#search_result_id").val("");
  },500);
};

var windowTabHidden = false;
$(window).focus(function() { windowTabHidden = false; });
$(window).blur(function() { windowTabHidden = true; });

var activeEditor = 0;
var activeEditorElement = 0;
function start_inline_editor(element) {
    if (activeEditor) {
        if (activeEditorElement == element) { return; }
        finishInlineEditor(activeEditor);
    }
    activeEditorElement = element;
    activeEditorElement.setAttribute('contenteditable', 'true');
    var toolbar = ( $(activeEditorElement).hasClass('xolrn-page-wrapper') ? 'InlinePage' :
                    $(activeEditorElement).hasClass('description') ? 'InlineBasic' : 'Plain' );
    var parent = $(activeEditorElement).closest('.emmbedded-book-page-wrapper');
    activeEditor = CKEDITOR.inline(activeEditorElement, {
        customConfig: '../ck_config.js',
        toolbar: toolbar,
        entities: false,
        basicEntities: false,
        package_url: '/ckeditor/',
        parent_id: ( parent.length ? parent.attr('id').substr(3) : '' ),
        parent_name: ( parent.length ? parent.data('name') : '' )
    });
    activeEditor.on('blur', function() {
        if ($('.ui-dialog:visible').length) {
            // we have just opened the image, formel or xoqti plugin dialog
            // so reset the focus as soon as the dialog is closed
            $('.ui-dialog:visible').one('dialogclose', function() {
                var data = $('<div>'+activeEditor.getData()+'</div>');
                data.find('img[data-wiki-link-type], [data-wiki-link-type] source').each(function() {
                    var path = $(this).attr('src').split('/');
                    if (path.length == 2) {
                        $(this).attr('src', activeEditor.config.parent_name + '/' + path[1]);
                    }
                });
                activeEditor.setData(data.html());
                activeEditorElement.focus();
            });
        } else if (windowTabHidden) {
            // the browser tab was deactivated, so reset the focus as soon as the tab will be reactivated
            $(document).one('focus', function() {
                activeEditorElement.focus();
            });
        } else {
            finishInlineEditor(activeEditor);
        }
    });
    if (toolbar == 'Plain') {
        activeEditor.on('instanceReady', function() {
            this.execCommand('selectAll');
        });
    }
    activeEditorElement.focus();
}

function close_inline_editor(editor) {
    if (editor == activeEditor) {
        activeEditor = 0;
        activeEditorElement = 0;
    }
    editor.element.setAttribute('contenteditable', 'false');
    editor.destroy();
}

function photo_editing_mode(item_id, enable) {
    $.get(location.pathname+'?m=toggle-book-photo-editing-mode', {item_id: item_id, enable: enable}, function(data) {
        if (!enable) {
            // move the dropzone back to prevent it from being removed
            $('#import_files').insertAfter('#ibook').hide();
        }
        $('#el_'+item_id).find('.photo-show').replaceWith(data);
        if (enable) {
            $('#el_'+item_id+' .photo-show').addClass('above-overlay');
            $('#ibook-overlay').addClass('active');
            $('#ibook-overlay').one('click', function() {
                // disable photo editing mode if clicked outside
                photo_editing_mode(item_id, 0);
                $('#ibook-overlay').removeClass('active');
            });
            $('#import_files').insertAfter('#el_'+item_id+' .album-menu').show();
            $('#import_files [name=upload_target_id]').val(item_id);
        }
    }, 'html').fail(function(response) {
        if (enable) {
            alert( response.status == 403 ? response.responseText : response.statusText );
        } else {
            // reload the book if an error occured while disabling editing mode
            window.location.reload();
        }
    });
}

var DRAGFLAG = false;

$(function() {
  $(document).on("dragstart", ".draggable", function() { DRAGFLAG = true; });
  $(document).on("dragstop", ".draggable", function() { DRAGFLAG = false; });
});
