/**
 * Plugin zur automatischen Erzeugung von JavaScript-basierten Paginierungen.
 *
 * Verwendungs-Beispiele:
 *
 * Standard-Setup:
 * 
 * $('#paged_content div.page').kkpagination();
 *
 * Erzeugt eine Standard-Paginierung ueber alle DIV-Elemente mit der Klasse "page"
 * innerhalb des Elements mit der ID "#paged_content". Die Paginierung wird in
 * das Eltern-Element des ersten DIV mit der Klasse "page" eingefuegt.
 *
 * Paginierung in einem anderen Element unterbringen:
 *
 * $('#paged_content div.page').kkpagination('#pagination');
 *
 * Erzeugt die gleiche Paginierung wie im vorigen Beispiel, diesmal aber wird die
 * Paginierung in das Element mit der ID "pagination" eingefuegt.
 *
 * Optionen ueberschreiben: Eigenes Wrapping-HTML:
 *
 * $('#paged_content div.page').kkpagination(null, {
 *    paginationWrapHTML: '<div class="mywrap">Blättern:<br/></div>'
 * });
 *
 * Erzeugt die gleiche Paginierung wie im ersten Beispiel. Die Paginierung wird
 * aber als Kind-Element in das angegebene paginationWrapHTML eingefuegt und dieses
 * anschliessend anstelle der Paginierung in das Eltern-Element des ersten DIV
 * mit der Klasse "page" eingefuegt.
 *
 * Aktionen:
 *
 * 1. Seite manuell ändern:
 *
 * $('#paged_content div.page').kkpagination(null, "page", 3);
 *
 * Erzeugt dieselbe Paginierung wie im ersten Beispiel (falls noch nicht vorhanden)
 * und wechselt zu Seite 3.
 *
 * @version 1.1
 * @author Kristian Kriehl (kristian.kriehl/at/reality-bytes.com)
 *
 * Changelog:
 * 02.11.2010:
 * - Abschnittsbasierte Navigation wieder entfernt und anstelle dessen die
 *   Eigenschaft "cutout" (Ausschnitt) mit dem Format
 *   "AnzahlSeitenVorAktuellerSeite:AnzahlSeitenNachAktuellerSeite" zur absoluten
 *   Paginierung hinzugefuegt und dadurch ca. 3 Millionen Operationen und
 *   ebenso viele Zeilen von nicht mehr benoetigtem Code entfernt.
 *
 * 19.10.2010:
 * - Abschnittsbasierte Navigation integriert
 * - Label fuer vor und nach einem Navigationselement wurden hinzugefuegt
 * - Die Anzeige von Navigationselementen mit der Eigenschaft "display" auf
 *   "conditional" haben eine neue Eigenschaft "condition", welche die Bedingung
 *   zur Anzeige des Elementes enhalten kann, z.B. "{PAGE_NUM} > 1": Das Element
 *   wuerde erst ab Seite 2 angezeigt werden. Die Platzhalter {PAGE_NUM} und
 *   {PAGE_COUNT} stehen zur Verfuegung.
 *
 * 30.09.2010:
 * - Unterstuetzung fuer das history-PlugIn
 *   (http://www.mikage.to/jquery/jquery_history.html) hinzugefuegt.
 */
(function($){
	var options = {
		paginationWrapHTML: null,
		containerType     : 'ul',
		controlType       : 'li',
		clickableType     : 'a'
	};

	/**
	 * Erzeugt die JavaScript Paginierung ueber die selektierten Elemente.
	 *
	 * @param {misc} paginationParent [Optional] Das Eltern-Objekt fuer die Paginierung.
	 * Es kann ein Objekt oder ein jQuery-kompatibler Selektor sein.
	 * Die Paginierung wird dann als Kind-Element dem Ziel hinzugefuegt. Wird
	 * der Parameter leer uebergeben wird das Elternelement des ersten
	 * Seiten-Inhalts als Ziel verwendet.
	 * @param {misc} action_or_options [Optional] Entweder eine Aktion (vom Typ String)
	 * oder ein Objekt mit ueberschriebenen Optionen.
	 * @param {misc} arguments [Optional] Parameter fuer eine Aktion.
	 */
	$.fn.kkpagination = function(paginationParent, action_or_options, arguments) {
		if(this.length > 0) {
			var $paginationParent;

			if(paginationParent) {
				$paginationParent = $(paginationParent);
			} else {
				$paginationParent = this.eq(0).parent();
			}

			var selfOpts = $paginationParent.data('options');

			if(!selfOpts || typeof selfOpts != 'object') {
				selfOpts = options;
			}

			if(typeof action_or_options == "object") {
				selfOpts = $.extend(true, selfOpts, action_or_options);
				$paginationParent.data('options', selfOpts);
			}

			var $pagination = createPagination(selfOpts, this, $paginationParent);

			showPage(selfOpts, $pages, $pagination, 1);

			// Falls das History-Plugin fuer jQuery verfuegbar ist und noch nicht
			// initialisiert wurde kann es zur Ueberwachung der Browser-History
			// verwendet werden um bei einer Aenderung der History entweder zur
			// angegebenen oder ersten Seite zu wechseln
			if(!$.fn.kkpagination.historyAvailable && $.history) {
				// Name der aktuellen Datei ermitteln
				var currentFileName = window.location.pathname.substring(window.location.pathname.lastIndexOf("/") + 1);

				// Fuer die Lambda-Funktion eine Referenz auf das aktuelle
				// Match-Set erstellen
				var $pages = this;

				// Callback registrieren
				$.history.init(function(hash) {
					// Seiten-Nummer aus dem Hash extrahieren
					var pageNum = hash.match(/page-([0-9]+)/);
					    pageNum = pageNum != null && !isNaN(pageNum[1]) ? parseInt(pageNum[1], 10) : null;
					// aktuelle Seite zum Vergleich holen (keine ueberfluessigen Requests)
					var currentPage = parseInt($pagination.attr($.fn.kkpagination.attr.currentPage), 10);

					// Wenn die Seiten-Nummer sich von der aktuellen Seite 
					// unterscheidet und valide ist, auf diese Seite wechseln
					if(pageNum != null && pageNum != currentPage) {
						showPage(selfOpts, $pages, $pagination, pageNum);
					} else if(pageNum == null) {
						showPage(selfOpts, $pages, $pagination, 1);
					}
				}, currentFileName);

				$.fn.kkpagination.historyAvailable = true;
			}

			if(action_or_options == $.fn.kkpagination.keys.actionShowPage) {
				showPage(selfOpts, this, $pagination, arguments);
			} else if(action_or_options == $.fn.kkpagination.keys.actionRemovePagination) {
				var $wrapper = $pagination.closest('.' + $.fn.kkpagination.clazz.wrapper);

				if($wrapper.length > 0) {
					$wrapper.remove()
				} else {
					$pagination.remove();
				}
			} else if(location.hash === "") {
				showPage(selfOpts, this, $pagination, 1);
			}
		}
		
		return this;
	}

	$.fn.kkpagination.historyAvailable = false;

	/**
	 * Erzeugt das Paginierungs-HTML und gibt den Container als jQuery-Objekt
	 * zurueck.
	 *
	 * @param {object} options Options-Objekt
	 * @param {jQuery} $pages Die zu paginierenden Seiten als jQuery-Array
	 * @param {jQuery} $paginationParent Das Eltern-Objekt fuer die Paginierung als jQuery-Objekt
	 */
	function createPagination(options, $pages, $paginationParent) {
		var $pagination = $paginationParent.find('.' + $.fn.kkpagination.clazz.container);

		if($pagination.length == 0) {
			$pages.hide().filter(':first').show().addClass($.fn.kkpagination.clazz.contentActive);
			
			var paginationHTML = '<' + options.containerType + ' class="' + $.fn.kkpagination.clazz.container + '">';

			for(var i in $.fn.kkpagination.defaultControls) {
				paginationHTML += createControlsHTML(
					options,
					$.fn.kkpagination.keys.controlIDPrefix + i,
					$.fn.kkpagination.defaultControls[i],
					$pages
				);
			}

			paginationHTML += '</' + options.containerType + '>';

			if(options.paginationWrapHTML) {
				var $wrapper = $(options.paginationWrapHTML)
					.appendTo($paginationParent)
					.addClass($.fn.kkpagination.clazz.wrapper);
				
				if($wrapper.find($.fn.kkpagination.clazz.wrapTarget).length > 0) {
					$pagination = $(paginationHTML).appendTo($wrapper.find($.fn.kkpagination.clazz.wrapTarget));
				} else {
					$pagination = $(paginationHTML).appendTo($wrapper);
				}
			} else {
				$pagination = $(paginationHTML).appendTo($paginationParent);
			}

			$pagination.find(options.clickableType).click(function() {
				showPage(options, $pages, $pagination, $(this).attr('rel'));
				return false;
			});

			$pagination.attr($.fn.kkpagination.attr.currentPage, 1);

			var $controlsNext = $pagination.find('.' + $.fn.kkpagination.clazz.next);
			var $controlsPrevious = $pagination.find('.' + $.fn.kkpagination.clazz.previous);

			$pagination.attr($.fn.kkpagination.attr.pageCount, $pages.length);
			
			$pagination.data('controls', {
				nextAlways         : $controlsNext.filter('.' + $.fn.kkpagination.clazz.displayAlways),
				nextConditional    : $controlsNext.filter('.' + $.fn.kkpagination.clazz.displayConditional),
				previousAlways     : $controlsPrevious.filter('.' + $.fn.kkpagination.clazz.displayAlways),
				previousConditional: $controlsPrevious.filter('.' + $.fn.kkpagination.clazz.displayConditional),
				page               : $pagination.find('.' + $.fn.kkpagination.clazz.page),
				spacerBefore       : $pagination.find('.' + $.fn.kkpagination.clazz.spacerBefore),
				spacerAfter        : $pagination.find('.' + $.fn.kkpagination.clazz.spacerAfter)
			});
		}

		return $pagination;
	}

	/**
	 * Erzeugt das HTML fuer ein Kontroll-Element innerhalb der Paginierung.
	 *
	 * @param {object} options Options-Objekt
	 * @param {string} id ID fuer das Kontroll-Element
	 * @param {object} config Config-Objekt fuer das Kontroll-Element
	 * @param {jQuery} $pages Die zu paginierenden Seiten als jQuery-Array
	 */
	function createControlsHTML(options, id, config, $pages) {
		var controls = '';
		var title = '';
		var html;
		var displayClass = $.fn.kkpagination.clazz.displayAlways;
		var visible = true;
		var pageNum = 1;
		var pageCount = $pages.size();
		var isConditional = false;

		// Beding angezeigte Elemente haben eine spezielle Klasse und werden initial
		// standardmaessig nicht angezeigt
		if(config.display === $.fn.kkpagination.keys.displayConditional) {
			displayClass = $.fn.kkpagination.clazz.displayConditional;
			isConditional = true;
		}

		// ---------------------------------------------------------------------
		// TARGET
		// ---------------------------------------------------------------------
		if(config.type === $.fn.kkpagination.keys.controlTypeTarget) {
			if(config.target === $.fn.kkpagination.keys.controlTargetPrevious) {
				pageNum = '';
				visible = isConditional ? false : true;
				// Wenn eine spezielle Bedingung zur Anzeige vorliegt muss diese
				// noch evaluiert werden
				if(isConditional && config.condition) {
					visible = evaluateCondition(replaceAllProps(config.condition, 1, pageCount));
				}
				displayClass += ' ' +
					$.fn.kkpagination.clazz.previous + ' ' +
					(isConditional ? '' : $.fn.kkpagination.clazz.disabled);
			} else if(config.target === $.fn.kkpagination.keys.controlTargetNext) {
				pageNum = '';
				visible = true;
				// Wenn eine spezielle Bedingung zur Anzeige vorliegt muss diese
				// noch evaluiert werden
				if(isConditional && config.condition) {
					visible = evaluateCondition(replaceAllProps(config.condition, 1, pageCount));
				}
				displayClass += ' ' +
					$.fn.kkpagination.clazz.next + ' ' +
					(isConditional ? '' : $.fn.kkpagination.clazz.disabled);
			} else if(config.target === $.fn.kkpagination.keys.controlTargetFirstPage) {
				pageNum = 1;
				visible = isConditional ? false : true;
				// Wenn eine spezielle Bedingung zur Anzeige vorliegt muss diese
				// noch evaluiert werden
				if(isConditional && config.condition) {
					visible = evaluateCondition(replaceAllProps(config.condition, 1, pageCount));
				}
				if(!isConditional) {
					displayClass += ' ' + $.fn.kkpagination.clazz.disabled;
				}
			} else if(config.target === $.fn.kkpagination.keys.controlTargetLastPage) {
				pageNum = pageCount;
				visible = true;
				// Wenn eine spezielle Bedingung zur Anzeige vorliegt muss diese
				// noch evaluiert werden
				if(isConditional && config.condition) {
					visible = evaluateCondition(replaceAllProps(config.condition, 1, pageCount));
				}
				if(!isConditional) {
					displayClass += ' ' + $.fn.kkpagination.clazz.disabled;
				}
			}

			html      = replaceAllProps(config.html, pageNum, pageCount);
			title     = replaceAllProps(config.title, pageNum, pageCount);
			controls += createPageLinkHTML(options, false, visible, true, {
				"title": title,
				"html" : html,
				"rel"  : config.target,
				"class": displayClass,
				"id"   : id
			});
		}
		// ---------------------------------------------------------------------
		// ABSOLUTE
		// ---------------------------------------------------------------------
		else if(config.type == $.fn.kkpagination.keys.controlTypeAbsolute) {
			var visibleEnd = pageCount;

			if(config.cutout && config.cutout !== "") {
				var cutout = parseCutout(config.cutout);
				
				if(cutout) visibleEnd = cutout.before + cutout.after + 1;
			}

			if(config.spacerAfter) {
				controls += createLabelHTML(options, config.spacerBefore, true, true);
			}

			for(pageNum = 1; pageNum <= pageCount; pageNum++) {
				html      = replaceAllProps(config.html, pageNum, pageCount);
				title     = replaceAllProps(config.title, pageNum, pageCount);
				visible   = pageNum <= visibleEnd;
				controls += createPageLinkHTML(options, pageNum == 1, visible, false, {
					"title": title,
					"html" : html,
					"rel"  : pageNum,
					"class": $.fn.kkpagination.clazz.page,
					"id"   : id
				});
			}

			if(config.spacerAfter) {
				controls += createLabelHTML(options, config.spacerAfter, true, true);
			}
		}
		// ---------------------------------------------------------------------
		// LABEL
		// ---------------------------------------------------------------------
		else if(config.type == 'label') {
			html      = replaceAllProps(config.html, 1, pageCount);
			controls += createLabelHTML(options, html, false, false);
		}

		// Trenner vor dem Element
		controls = controls.replace('{SPACER_BEFORE}', config.spacerBefore ? createLabelHTML(options, config.spacerBefore, true, true) : '');
		// Trenner nach dem Element
		controls = controls.replace('{SPACER_AFTER}', config.spacerAfter ? createLabelHTML(options, config.spacerAfter, true, true) : '');

		return controls;
	}

	/**
	 * Erzeugt das HTML fuer einen Seiten-Link.
	 *
	 * @param {object} options Options-Objekt
	 * @param {boolean} active Ist der Link bzw. die Seite aktiv
	 * @param {boolean} visible Ist der Link sichtbar
	 * @param {boolean} addLabels Sollen Label-Platzhalter eingefuegt werden
	 * @param {object} attributes Weitere HTML-Attribute
	 * @return {string} HTML
	 */
	function createPageLinkHTML(options, active, visible, addLabels, attributes) {
		var attributeString = "";

		for(var attr in attributes) {
			if(typeof attributes[attr] !== "object" && attr !== "class" && attr !== "html") {
				attributeString += " " + attr + '="' + attributes[attr] + '"';
			}
		}

		return '<' + options.controlType + ' ' +
			'class="' + (attributes["class"] ? " " + attributes["class"] : "") + (active ? " " + $.fn.kkpagination.clazz.pageActive : "") + '"' +
			(visible ? '' : ' style="display:none"') +
			'>' +
			(addLabels ? '{SPACER_BEFORE}' : '') +
			'<' + options.clickableType + attributeString + ' href="javascript:void(0);">' +
				attributes["html"] +
			'</' + options.clickableType + '>' +
			(addLabels ? '{SPACER_AFTER}' : '') +
		'</' + options.controlType + '>';
	}

	/**
	 * Erzeugt das HTML fuer ein Label-Element.
	 *
	 * @param {object} options Options-Objekt
	 * @param {string} html HTML-Inhalt des Labels
	 * @param {boolean} inline Ist das Label innerhalb eines Controls
	 * @param {boolean} visible Ist das Label sichtbar
	 * @return {string} HTML
	 */
	function createLabelHTML(options, html, inline, visible) {
		var tagName = inline ? 'span' : options.controlType;

		return '<' + tagName + ' class="' + $.fn.kkpagination.clazz.label + '"' + (visible ? '' : ' style="display:none"') + '>' +
			html +
		'</' + tagName + '>';
	}

	/**
	 * Wechselt die aktuell angezeigte Seite.
	 *
	 * @param {object} options Options-Objekt
	 * @param {jQuery} $pages Die zu paginierenden Seiten als jQuery-Array
	 * @param {jQuery} $pagination Der Container mit der Paginierung als jQuery-Objekt
	 * @param {misc} targetPageNum Seitennummer (minimum ist 1) der anzuzeigenden Seite
	 */
	function showPage(options, $pages, $pagination, targetPageNum) {
		var currentPage  = parseInt($pagination.attr($.fn.kkpagination.attr.currentPage), 10);
		var pageCount    = parseInt($pagination.attr($.fn.kkpagination.attr.pageCount), 10);
		var previousPage = parseInt(currentPage, 10);
		var controls     = $pagination.data('controls');

		// Auswertung der Seitenangabe:

		// Vorherige Seite
		if(targetPageNum == "previous") {
			if(currentPage > 1) {
				currentPage--;
			}
		// Naechste Seite
		} else if(targetPageNum == "next") {
			if(currentPage < pageCount) {
				currentPage++;
			}
		// Erste Seite
		} else if(targetPageNum == "first") {
			currentPage = 1;
		// Letzte Seite
		} else if(targetPageNum == "last") {
			currentPage = pageCount;
		// numerische/absolute Seitenagabe
		} else if(!isNaN(targetPageNum)) {
			// Ueberpruefen ob die numerische Angabe innerhalb der zur
			// Verfuegung stehenden Seiten liegt
			if(targetPageNum >= 1 && targetPageNum <= pageCount) {
				currentPage = parseInt(targetPageNum, 10);
			}
		}

		// Nur die Seite wechseln falls die aufzurufende Seite sich von der
		// bisherigen Seite unterscheidet
		if(currentPage != previousPage) {
			if(currentPage === 1) {
				// dauerhaft eingeblendete Vorwaerts-Elemente "deaktivieren"
				controls.previousAlways.addClass($.fn.kkpagination.clazz.disabled);
			} else if(currentPage === 2) {
				// dauerhaft eingeblendete Vorwaerts-Elemente "aktivieren"
				controls.previousAlways.removeClass($.fn.kkpagination.clazz.disabled);
			}

			if(currentPage === pageCount) {
				// dauerhaft eingeblendete Vorwaerts-Elemente "deaktivieren"
				controls.nextAlways.addClass($.fn.kkpagination.clazz.disabled);
			} else if(currentPage === pageCount - 1) {
				// dauerhaft eingeblendete Vorwaerts-Elemente "aktivieren"
				controls.nextAlways.removeClass($.fn.kkpagination.clazz.disabled);
			}
			
			var config;
			var absConfig;
			var $control;
			var isVisible = false;

			for(var controlIDX in $.fn.kkpagination.defaultControls) {
				config = $.fn.kkpagination.defaultControls[controlIDX];

				if(config.display === "conditional") {
					$control = $('#' + $.fn.kkpagination.keys.controlIDPrefix + controlIDX);

					// eigene Bedingung evaluieren
					if(config.condition) {
						isVisible = evaluateCondition(replaceAllProps(config.condition, currentPage, pageCount));
					// fuer previous-Elemente ist keine Bedingung notwendig
					} else if(config.type === "target" && config.target === "previous") {
						isVisible = currentPage > 1;
					// fuer next-Elemente ist keine Bedingung notwendig
					} else if(config.type === "target" && config.target === "next") {
						isVisible = currentPage < pageCount;
					}

					if(isVisible) {
						$control.parent().show();
					} else {
						$control.parent().hide();
					}
				}

				if(config.type === "absolute") {
					absConfig = config;
				}
			}

			// bei absoluter Paginierung ggf. nur einen Ausschnitt anzeigen
			if(absConfig && absConfig.cutout) {
				var cutout = parseCutout(absConfig.cutout);

				if(cutout) {
					var prependCount = cutout.before;
					var appendCount = cutout.after;
					var delta = 0;

					if(currentPage + cutout.after > pageCount) {
						delta = currentPage + cutout.after - pageCount;
						appendCount -= delta;
						prependCount += delta;
					}
					
					if(currentPage < cutout.before + 1) {
						delta = cutout.before + 1 - currentPage;
						appendCount += delta;
						prependCount -= delta;
					}

					controls.page.hide();

					var startPage = currentPage - prependCount;
					var endPage = currentPage + appendCount;

					for(var c = startPage; c <= endPage; c++) {
						controls.page.eq(c-1).show();
					}
				}
			}

			// Seiten "deaktivieren"
			controls.page.removeClass($.fn.kkpagination.clazz.pageActive);

			// bisher angezeigte Seite in den absoluten Navigationselementen
			// suchen und "aktivieren"
			controls.page.find(options.clickableType + '[rel=' + currentPage + ']')
				.parent(options.controlType)
				.addClass($.fn.kkpagination.clazz.pageActive);

			$pagination.attr($.fn.kkpagination.attr.currentPage, currentPage);

			// Aktuelle Seite verstecken und neue Seite anzeigen
			$pages.eq(previousPage -1).hide().andSelf().eq(currentPage-1).show();
		}

		// Falls das History-PlugIn eingebunden und initialisiert ist die aktuelle
		// Seite im Hash speichern
		if($.fn.kkpagination.historyAvailable && currentPage > 1) {
			window.location.hash = "page-" + currentPage;
		}
	}

	/**
	 * Ersetzt alle Vorkommen der in $.fn.kkpagination.props definierten Property-
	 * Schluesselwoerter durch den uebergebenen Wert. Wird fuer eine Property
	 * kein Wert uebergeben wird das Schluesselwort aus dem Text entfernt.
	 *
	 * @param {string} text Der Text in dem die Properties ersetzt werden sollen
	 * @param {int} pageNum Wert fuer die Property pageNum
	 * @param {int} pageCount Wert fuer die Property pageCount
	 * @return {string} ersetzter Text
	 */
	function replaceAllProps(text, pageNum, pageCount) {
		if(!text) return null;

		if(!pageNum) pageNum = '';
		if(!pageCount) pageCount = '';

		while(text.indexOf($.fn.kkpagination.props.pageNum) >= 0) {
			text = text.replace($.fn.kkpagination.props.pageNum, pageNum);
		}

		while(text.indexOf($.fn.kkpagination.props.pageCount) >= 0) {
			text = text.replace($.fn.kkpagination.props.pageCount, pageCount);
		}

		return text;
	}

	function evaluateCondition(condition) {
		return eval(condition);
	}

	function parseCutout(cutout) {
		if(cutout && typeof cutout === "string") {
			cutout = cutout.split(":");

			if(isNaN(cutout[0]) || isNaN(cutout[1])) return null;

			return {
				before: parseInt(cutout[0], 10),
				after : parseInt(cutout[1], 10)
			};
		} else return null;
	}

	/**
	 * @property Klassen fuer das zu erzeugende HTML
	 */
	$.fn.kkpagination.clazz = {
		container         : 'kkpagination-container',
		contentActive     : 'kkpagination-content-active',
		label             : 'kkpagination-label',
		page              : 'kkpagination-page',
		wrapper           : 'kkpagination-wrapper',
		wrapTarget        : 'kkpagination-wrap-target',
		pageActive        : 'kkpagination-page-active',
		next              : 'kkpagination-next',
		previous          : 'kkpagination-previous',
		displayConditional: 'kkpagination-display-conditional',
		displayAlways     : 'kkpagination-display-always',
		disabled          : 'kkpagination-disabled',
		spacerBefore      : 'kkpagination-spacer-before',
		spacerAfter       : 'kkpagination-spacer-after'
	};

	/**
	 * @property Attributnamen zur Steuerung
	 */
	$.fn.kkpagination.attr = {
		currentPage: 'kkpagination-current-page',
		pageCount  : 'kkpagination-page-count'
	};

	/**
	 * @property Spezielle Schluessel und Konstanten
	 */
	$.fn.kkpagination.keys = {
		controlIDPrefix       : 'kkpagination-control-id-',
		displayAlways         : 'always',
		displayConditional    : 'conditional',
		actionShowPage        : 'page',
		actionRemovePagination: 'remove',
		controlTypeTarget     : 'target',
		controlTypeAbsolute   : 'absolute',
		controlTargetPrevious : 'previous',
		controlTargetNext     : 'next',
		controlTargetFirstPage: 'first',
		controlTargetLastPage : 'last'
	}

	/**
	 * @property Schuesselwoerter die in Titel, HTML etc. durch dynamische Werte
	 * ersetzt werden
	 */
	$.fn.kkpagination.props = {
		pageNum  : '{PAGE_NUM}',
		pageCount: '{PAGE_COUNT}'
	};

	/**
	 * @property Standard-Kontroll-Elemente
	 */
	$.fn.kkpagination.defaultControls = [{
			type: 'previous',
			display: 'conditional',
			title: 'Vorige Seite',
			html: '&lt;&lt;'
		},{
			type: 'absolute',
			title: 'Seite {PAGE_NUM}',
			html: '{PAGE_NUM}'
		},{
			type: 'next',
			display: 'conditional',
			title: 'Nächste Seite',
			html: '&gt;&gt;'
		}
	];
})(jQuery)

