/******************************************************************************
 * Allgemeine Funktionen
 ******************************************************************************/

document.getElementsByClassName = function(cl) {
	var retnode = [];
	var myclass = new RegExp('\\b'+cl+'\\b');
	var elem = this.getElementsByTagName('*');
	for (var i = 0; i < elem.length; i++) {
		var classes = elem[i].className;
		if (myclass.test(classes)) retnode.push(elem[i]);
	}
	return retnode;
}; 

function delegate(method, context) {
  return function() {
      var args = Array.prototype.slice.call(arguments, 0);
      method.apply(context, args);
  };
}

function extend(clazz, parent, members) {
    var helper = new Function();
    helper.prototype = parent.prototype;

    var proto = clazz.prototype = new helper;
    for (var key in members)  {
        proto[key] = members[key];
    }
}

var Pager = function() {
	// page offset
	this.offset = null;

	// page limit
	this.limit = null;

	// DOM object (container) to insert the pager (HTML)
	this.placeHolder = null;

	// function that handles the click on a page
	this.callback = null;
	
	// start page of displayed pager
	this.beginCounter = 1;

	// end page of displayed pager
	this.endCounter = 1;
};

extend(Pager, Object, {
	
	/**
	 * checks all params and set all class variables
	 * 
	 * @param {Integer}  offset
	 * @param {Integer}  limit
	 * @param {Object}   placeHolder
	 * @param {Function} callback
	 */
	init : function(offset, limit, placeHolder, callback) {
		if (typeof offset !== 'number') {
			return;
		}
	
		if (typeof limit !== 'number') {
			return;
		}
		
		if (typeof placeHolder !== 'object' || placeHolder.length === 0) {
			return;
		}
		
		if (offset > limit) {
			return;
		}
		
		this.offset = offset;
		this.limit = limit;
		this.placeHolder = placeHolder;
		this.callback = callback;

		this._calculatePager();
		this.display();
	},
	
	/**
	 * set offset of pager and calculates the new possible view
	 * 
	 * @param {Integer} offset
	 */
	setOffset : function(offset) {
		if (typeof offset !== 'number') {
			return;
		}
		
		this.offset = offset;
		this._calculatePager();
	},
	
	/**
	 * set limit of pager and calculates the new possible view
	 * 
	 * @param {Object} limit
	 */
	setLimit : function(limit) {
		if (typeof limit !== 'number') {
			return;
		}
		
		this.limit = limit;
		this._calculatePager();
	},
	
	/**
	 * calculates with all params the new view of pager
	 */
	_calculatePager : function() {
		this.beginCounter = 1;
		// show two numbers before offset
		if ((this.offset-2) >= 1) {
			this.beginCounter = (this.offset-2);
		}
		
		this.endCounter = this.limit;
		// show two numbers after offset
		if ((this.offset+2) <= this.limit) {
			this.endCounter = (this.offset+2);
		}
		
		// if current page is equal limit than decrement the begin counter again (to not destroy the view of pager)
		if (this.offset === this.limit) {
			if ((this.beginCounter - 2) >= 1) {
				this.beginCounter -= 2;
			} else {
				this.beginCounter = 1;
			}
		}

		// decrement one for the start counter if the current page is the last but one page
		if (this.offset === (this.limit - 1) && (this.beginCounter - 1) >= 1) {
			this.beginCounter -= 1;
		}
		
		// if current page is the first one than increment the end counter again (to not destroy the view of pager)
		if (this.offset === 1) {
			if ((this.endCounter + 2) <= this.limit) {
				this.endCounter += 2;
			} else {
				this.endCounter = this.limit;
			}
		}

		// increment one for the end counter if the current page is the second page
		if (this.offset === 2 && (this.endCounter + 1) <= this.limit) {
			this.endCounter += 1;
		}
	},
	
	/**
	 * build the html pager 
	 */
	display: function() {
		var _pager = [];

		_pager.push('<div class="pager">');
		
		// show left arrow
		if (this.offset > 1) {
			_pager.push('<a href="javascript:void(0);" class="arrowLeft"><<&nbsp;</a>');
		}

		for (var i = this.beginCounter; i <= this.endCounter; i++) {
			if (i == this.beginCounter) {
				var pageLang = document.getElementById('pageLang').innerHTML;
				_pager.push('<span id="pageLang">' + pageLang + '</span>');
		  	_pager.push('<a href="javascript:void(0);" class="' + (i === this.offset ? 'currentPage' : '') + '">' + i + '</a>');
		  }
		  else {
		  	_pager.push(' | <a href="javascript:void(0);" class="' + (i === this.offset ? 'currentPage' : '') + '">' + i + '</a>');
		  }
		}
		
		// show right arrow
		if (this.offset < this.limit) {
			_pager.push('<a href="javascript:void(0);" class="arrowRight">&nbsp;>></a>');
		}
		
		_pager.push('</div>');
		
		// wenn mehrere Pager existieren
		if (typeof(this.placeHolder) == 'object' && this.placeHolder[0].length != 'undefined') {
			for (j = 0; j < this.placeHolder.length; j++) {
				this.placeHolder[j].innerHTML = _pager.join('');
				var links = this.placeHolder[j].getElementsByTagName('a');
				
				for (i = 0; i < links.length; i++) {
					links[i].onclick = delegate(this._handleClick, this);
				}
			}
		} else {
			this.placeHolder.innerHTML =  _pager.join('');
			var links = this.placeHolder.getElementsByTagName('a');
			
			for (i = 0; i < links.length; i++) {
				links[i].onclick = delegate(this._handleClick, this);
			}
		}

	},
	
	/**
	 * handles the click on a page and call the callback function (if implemented) with the current page 
	 * 
	 * @param {Object} evt
	 */
	_handleClick : function(evt) {

		var _obj = (evt) ? evt.target : window.event.srcElement;

		if (_obj.length === 0) {
			return;
		}
		
		if (_obj.className.indexOf('offset') !== -1) {
			return;
		}
		
		document.getElementsByClassName('currentPage').className = '';

		var _isSpecialLink = false;		
		if (_obj.className === 'arrowToFirst') {
			this.offset = 1;
			_isSpecialLink = true;
		}
		
		if (_obj.className === 'arrowToLast') {
			this.offset = this.limit;
			_isSpecialLink = true;
		}
		
		if (_obj.className === 'arrowLeft') {
			this.offset -= 1;
			_isSpecialLink = true;
		}

		if (_obj.className === 'arrowRight') {
			this.offset += 1;
			_isSpecialLink = true;
		}
		
		if (false === _isSpecialLink) {
			this.offset = parseInt(_obj.innerHTML, 10);
		}

		this._calculatePager();
		this.display();
				
		if (typeof this.callback !== 'function') {
			return;
		}

		this.callback(this.offset);
	}
});


/******************************************************************************
 * Paging
 ******************************************************************************/

var listitems;
var len;
var num = 5;

var _callback = function(clickedPage) {

	for (var i=0; i<len; i++) {
		listitems[i].style.display = 'none';
		if (i < (clickedPage*num) && i >= (clickedPage*num)-num) {
			listitems[i].style.display = 'block';
		}
	}
}

function initPagebrowser() {
	
	if (!isNaN(document.getElementById('resultlist'))) {
		return;
	}
	listitems = document.getElementById('resultlist').getElementsByTagName('li');
	len = listitems.length;
	for (var i=0; i<len; i++) {
		listitems[i].style.display = 'block';
		if (i >= num) {
			listitems[i].style.display = 'none';
		}
	}

	// Pager einbinden
	var myPager = new Pager();
	var limit = Math.round(len/num);
	limit = (limit < len/num) ? limit+1 : limit;
	myPager.init(1, limit, document.getElementsByClassName('paging'), _callback);
}

function getCountResults(elm) {
	var elements = document.getElementsByClassName('currentNumber');
	for (i=0; i<elements.length; i++) {
		elements[i].className = '';
	}
	elm.className = "currentNumber";
	num = elm.innerHTML;
	initPagebrowser();
}

function spelling() {
	document.getElementById('searchword').value = document.getElementById('spelling').innerHTML;
	document.getElementById('topsuchform').submit();
}