(function( $ ){

	var methods = {
    	init : function( options ) {
    		if ( options ) { 
        		$.extend( $.fn.schplitzing.defaults, options );
      		}
      		opt = $.fn.schplitzing.defaults;
      		$this = $(this);
      		f.menulinks();
      		f.articleList();
      		f.getPositions();
      		f.logout($this);
      		$('.field_container').each(function(){
				var index = $(this).data('field');
				var scroll = $(this).jScrollPane({
					autoReinitialise: false,
					animateDuration: 500,
					contentWidth: 395
				});
				v.scrollbars[index] = scroll.data('jsp');
				v.article[index] = $(this).find('.article:first').attr('id');
				f.bindScrolling($this, $(this), index);
			});
			$('.menu_list_item').click(function(){
				var id = $(this).data('id');
				f.scrollToArticle(id, true, true, true);
				f.scrollToRelations(id);
			});
			f.hashNavigation($this);
			$('.show_about').click(function(){
				f.showAbout($this);
			});
			$('.loginform').submit(function(){
				$('#header_loading').addClass('loading');
				$(this).ajaxSubmit({
					success:   		function(data, status, xhr, form){
										if (data.status){
											 location.reload();
										} else {
											if (data.msg == 'wrong username'){
												$("label[for='uid']").addClass('alert');
											} else if (data.msg == 'wrong password'){
												$("label[for='pwd']").addClass('alert');
											}
										}
									},
					dataType:		'json'
				});
				return false;
			});
			$('.video_play').bind('click', function(e){
				e.stopPropagation();
				$(this).parents('.video').addClass('playing');
			});
			$.ajax({
			  	type : 		'POST',
			  	crossDomain: true,
			  	url : 		opt.schplitzingconnect+'?origin='+$('#header').data('origin')+'&struct=view&search=all',
			  	success : 	function(data, textStatus, jqXHR){
			  					if (opt.debug){ console.log('schplitzingconnect',data); }
			  					$('#header_loading').removeClass('loading');
			  					if (data.status){
			  						var con = 0; var ext = 0; var arte = []; var arti = [];
			  						$.each(data.connections, function(i, e){
			  							v.articles[e.id].connections = e;
			  							$('#'+e.id).data('connections', e);
			  							if (e.extern && $.inArray(e.id, arte) == -1){
			  								arte.push(e.id);
			  								$('<li>', {
			  									html : '<span class="connections_list_extern">'+e.title+'</span> - <span class="connections_list_title">'+e.schplitzing+'</span>'
			  								}).appendTo('.header_connections_list.extern_list').click(function(){
			  									f.scrollToArticle(e.id, true, true, true); f.scrollToRelations(e.id);
			  								});
			  								ext++;
			  							} else {
			  								$.each(e.connections, function(ind, el){
			  									if ($.inArray(e.id, arti) == -1){
				  									arti.push(e.id);
				  									var classes = (e.origin)? 'listed_connection origin' : 'listed_connection';
					  								$('<li>', {
					  									html : '<span class="connections_list_title">'+e.title+'</span> - <span class="connections_list_schplitzing">'+el.schplitzing+'</span>'
					  								}).addClass(classes).appendTo('.header_connections_list.connections_list').click(function(){
					  									f.scrollToArticle(e.id, true, true, true); f.scrollToRelations(e.id);
					  								});
					  								con++;
					  							}
				  							});
			  							}
			  						});
			  						$('.show_connections.con_connections').html('<div class="number">'+con+'</div>').click(function(){
			  							var show = $('.header_connections_list.connections_list').hasClass('show');
			  							$('.header_connections_list').removeClass('show');
			  							if (!show){ $('.header_connections_list.connections_list').addClass('show'); }
			  						});
			  						$('.show_connections.extern_connections').html('<div class="number">'+ext+'</div>').click(function(){
			  							var show = $('.header_connections_list.extern_list').hasClass('show');
			  							$('.header_connections_list').removeClass('show');
			  							if (!show){ $('.header_connections_list.extern_list').addClass('show'); }
			  						});
			  						$('#header_connections').addClass('show');
			  						$.each(v.article, function(i,e){
			  							f.drawConnections(e,i);
			  						});
			  						if (opt.debug){ console.log('articles', v.articles); }
			  					}
				},
				error :		function(jqXHR, textStatus, errorThrown){
								if (opt.debug){ console.log('error', textStatus) }
								$('#header_loading').removeClass('loading');
				},
				dataType :	'json'
			});
			$('.article').unbind('click').bind('click', function(){
				if (opt.expand){
					f.resizeArticle($this, $(this));
				} else {
					var field = $(this).parents('.field_container').data('field');
					if (f.scrollToRelations(v.article[field])) {
						f.focusField(field);
					}
				}				
			});

      	},
      	connectWithSchplitZing : function(options){
      		if (options) { 
        		$.extend($.fn.schplitzing.defaults, options);
      		}
      		opt = $.fn.schplitzing.defaults;
			if (opt.schplitzingorigin){
				var curl = window.location.href;
				var s = curl.indexOf(opt.schplitzingorigin);
				if (s == -1){
					$('body').connecting({
						schplitzingorigin : opt.schplitzingorigin,
					});
				}
			}
		}
    };
    
    var f = {
    	scrollToArticle : function(id, draw, animate, focus){
    		draw = (typeof draw == 'undefined')? true : draw; animate = (typeof animate == 'undefined')? true : animate; focus = (typeof focus == 'undefined')? false : focus;
    		var scrollto = (v.articles[id]) ? v.articles[id] : false;
    		if (scrollto){
    			if (Math.abs(scrollto.article.position().top - v.scrollbars[scrollto.field].getContentPositionY()) > 20){
					v.scrollbars[scrollto.field].scrollToElement(scrollto.article, true, animate);
					if (draw) { f.drawConnections(id); }
				}
				if (focus){
					f.focusField(scrollto.field);
				}
    		}
    	},
    	scrollToArticleFix : function(id){
    		var scrollto = (v.articles[id]) ? v.articles[id] : false;
    		if (scrollto){
    			v.scrollbars[scrollto.field].scrollToElement(scrollto.article, true, false);
    		}
    	},
    	scrollToRelations : function (id){
    		var article = (v.articles[id])? v.articles[id]: false;
    		if (article.relations){
    			$.each(article.relations, function(index, elem){
					if (!isNaN(elem)){ 
						scrollto = (article.field != index && v.articles[elem] && v.articles[elem].field == index)? elem : false;
					} else if (article.field != index && elem == 'w'){ 
						scrollto = elem+index;
					} else { 
						scrollto = false;
					}
					f.scrollToArticle(scrollto);
				});
				return true;
    		} else {
    			return false;
    		}
		},
		bindScrolling : function(elem, scrollpane, field){
			scrollpane.bind('jsp-scroll-y', function(event, scrollPositionY, isAtBottom, isAtTop){
				$(this).find('.video').removeClass('playing');
				if ($(this).is(':hover')){
					f.focusField(field);
				}
				var art = f.getCurrentArticle(field, scrollPositionY);
				if (art){
					if (art != v.article[field]){
						if (typeof v.menu[v.article[field]] == 'object'){ v.menu[v.article[field]].removeClass('active'); }
						v.article[field] = art;
						if (typeof v.menu[art]  == 'object'){ v.menu[art].addClass('active'); }
						if ($(this).is(':hover')){
							if (v.article[field]){
								f.drawConnections(art);
								f.scrollToRelations(art);
							}
						}
					}
				}
			});
		},
		unbindScrolling : function(elem, scrollpane){
			scrollpane.unbind('jsp-scroll-y');
		},
		getCurrentArticle : function (field, position){
			current = false;
			position = position + 50;
			$.each(v.positions[field], function(i,e){
				if (e.top <= position && position <= e.bottom){
					current = e.article;
				}
			});
			return current;
		},
		focusField : function(field){
			$('.field_container').each(function(){
				if ($(this).data('field') == field && !$(this).hasClass('focus')){
					$(this).addClass('focus');
				} else if ($(this).data('field') != field && $(this).hasClass('focus')) {
					$(this).removeClass('focus');
				}
			});
		},
		showAbout : function(elem){
			if ($('#about').is(':visible')){
				$('#about').fadeOut('100', function(){
					$('body, #about_text').unbind('click');
				});
			} else {
				$('#about').fadeIn('100', function(){
					$('body').bind('click', function(){
						$('#about').fadeOut('100', function(){
							$('body, #about_text').unbind('click');
						});
					})
					$('#about_text').bind('click', function(event){
						 event.stopPropagation();
					});
				});
			}
		},
		hashNavigation : function (elem){
			if (window.location.hash){
				if (window.location.hash == '#about'){
					f.showAbout(elem);
					var field = '1';
					var article = $('.article:first').next();
				} else {
					var article = $(window.location.hash);
					if (article.size() > 0){
						var field = article.parents('.field_container').data('field');
					} else {
						var field = '1';
						var article = $('.article:first').next('.article');
					}
				}
			} else {
				var field = '1';
				var article = $('.article:first').next();
			}
			if(article.size() > 0){
				f.focusField(field);
				v.scrollbars[field].scrollToElement(article, true, true);
				f.scrollToRelations(article.attr('id'));
			}
			f.loadImages(elem);
			setTimeout(function(){ f.loadExternalArticles(elem); $.each(v.article, function(i,e){ f.drawConnections(e,i);});}, 1000);
			
		},
		loadImages : function(elem, images, scroll){
			opt = elem.schplitzing.defaults;
			images = (typeof images == 'object')? images.find('.imgtoload') : $('.imgtoload');
			images.each(function(index){
				var article = $(this).parents('.article');
				var field = article.parents('.field_container').data('field');
				var path = (article.data('url'))? article.data('url')+$(this).data('src') : $(this).data('src');
				var toload = $(this);
				if ($(this).data('width')){
					$('<img class="image" src="'+path+'" style="width:'+$(this).data('width')+'%" />').load(function(){
						toload.replaceWith($(this));
					});
				} else {
					$('<img class="image" src="'+path+'" />').load(function(){
						toload.replaceWith($(this));
					});
				}
			});
		},
		loadExternalArticles : function(elem){
			var artsize = $('.article.extern').size()-1;
			$('.article.extern').each(function(i,e){
				var art = $(this);
				var field = art.parents('.field_container').data('field');
				if ($(this).data('extern')){
					var articleid = v.article[field];
					f.getExternalArticel(elem, art.data('url'), art.data('externid'), function(data){
						art.html(data.content);
						f.loadImages(elem, art);
						f.reinitialiseScrollbars(elem, articleid);
					}, function(){
						v.articles[art.attr('id')].article.remove();
						v.menu[art.attr('id')].remove();
						delete v.articles[art.attr('id')];
						delete v.menu[art.attr('id')];
						f.getPositions();
					});
				}
			});
		},
		articleList : function(){
			$('.article').each(function(ind, art){
				v.articles[$(this).attr('id')] = {
					article : $(this),
					relations : $(this).data('relations'),
					data : $(this).data(),
					field : $(this).parents('.field_container').data('field'),
					connections : false
				}
			});
		},
		menulinks : function(){
			$('.menu_list_item').each(function(i,e){
				v.menu[$(this).data('id')] = $(this);
			});
		},
		getPositions : function(){
			$('.field_container').each(function(){
				var field = $(this).data('field');
				v.positions[field] = {};
				$(this).find('.article').each(function(i,e){
					var top = $(e).position().top;
					var bottom = top + $(e).outerHeight(true);
					v.positions[field][i] = {
						article : $(e).attr('id'),
						top : top,
						bottom : bottom
					}
				})
			});
		},
		reinitialiseScrollbars : function(elem, id){
			$.each(v.scrollbars, function(ind, scroll){
				v.scrollbars[ind].reinitialise();
				if (!isNaN(id)){
					f.scrollToArticleFix(id);
				}
				f.getPositions();
			});
		},
		reinitialiseScrollbar : function(elem, field, id){
			v.scrollbars[field].reinitialise();
			if (!isNaN(id)){
				f.scrollToArticleFix(id);
			}
			f.getPositions();
		},
		drawConnections : function(id, field){
			var article = v.articles[id];
			$('#field_connections_list_'+article.field).empty();
			$('#field_links_'+article.field).removeClass('linked origin');
			if (article.connections){
				$.each(article.connections.connections, function(i,e){
					var con = $('<li>', {
						html : '<span class="links_schplitzing_title">'+e.schplitzing+'</span> - <span class="links_schplitzing_author">'+e.schplitzing_author+'</span>'
					});
					if (e.origin){ con.addClass('connections_link connection_origin') } else { con.addClass('connections_link') }
					con.appendTo('#field_connections_list_'+article.field).click(function(){
						location.href = e.schplitzing_url+'#'+e.id;
					});
				});
				if (article.connections.origin){ $('#field_links_'+article.field).addClass('linked origin') } else { $('#field_links_'+article.field).addClass('linked'); }
			}
		},
		getExternalArticel : function(elem, origin, id, callback, error){
  			$.ajax({
			  	dataType: 'jsonp',
			  	jsonp: 'jsonp_callback',
			  	url: origin+'json/json.php?id='+id,
			  	success: function (data) {
			  		if (data.id){
			  			if (typeof callback == 'function'){ callback(data); }
			  		} else {
			  			if (typeof error == 'function'){ error(); }
			  		}
					
				},
				error: function(jqXHR, textStatus, errorThrown){
					if (typeof error == 'function'){ error(); }
				}
			});
  		},
  		logout : function(elem){
			opt = elem.schplitzing.defaults;
			$('a.logout').unbind('click').bind('click', function(event){
				event.preventDefault();
				dat = {
					task : 'logout',
				}
				$.post(opt.adminpath, dat, function(data) {
					window.location.reload();
				});
			});
		},
  		resizeArticle : function(elem, article){
  			var con = article.parents('.f_container');
  			var scrolling = article.parents('.field_container');
			$('.f_container').css({'z-index':'1'});
			con.css({'z-index':'10'});
			var id = article.attr('id');
			var art = v.articles[id];
			var field = art.field;
			f.scrollToArticle(id, true, false);
			f.unbindScrolling(elem, scrolling);
			var main = {
				start : {
					width : con.width(),
					height : con.height(),
					top : con.position().top,
					left : con.position().left
				}
			}
			var values = {
				start : {
					field_container : {
						width : con.find('.field_container').width(),
						height : con.find('.field_container').height()
					},
					jspContainer : {
						width : con.find('.jspContainer').width(),
						height : con.find('.jspContainer').height()
					},
					jspPane : {
						width : con.find('.jspPane').width()
					},
					article : {
						'min-height' : con.find('.field_container').height()
					}
				},
				delta : {
					field_container : {},
					jspContainer : {},
					jspPane : {},
					article : {}
				}
			};
			if (main.start.width == 600){
				con.siblings('.f_container').fadeOut();
				main.end = {
					width : 1010,
					height : 635
				};
				if (main.start.top == 0){
					main.end.top = 0;
				} else {
					main.end.top = 20
				}
				if (main.start.left == 0){
					main.end.left = 0;
				} else {
					main.end.left = 190;
				}
				values.end = {
					field_container : {
						width : 810,
						height : 610
					},
					jspContainer : {
						width : 810,
						height : 610
					},
					jspPane : {
						width : 805
					},
					article : {
						'min-height' : 600
					}
				};
			} else {
				con.siblings('.f_container').fadeIn();
				main.end = {
					width : 600,
					height : 325
				};
				if (field == '1'){
					main.end.top = 0;
					main.end.left = 0;
				} else if (field == '2') {
					main.end.top = 0;
					main.end.left = 600;
				}  else if (field == '3') {
					main.end.top = 330;
					main.end.left = 0;
				}  else if (field == '4') {
					main.end.top = 330;
					main.end.left = 600;
				}
				values.end = {
					field_container : {
						width : 400,
						height : 300
					},
					jspContainer : {
						width : 400,
						height : 300
					},
					jspPane : {
						width : 395
					},
					article : {
						'min-height' : 300
					}
				};
			}
			$.each(values.start, function(ind, el){
				$.each(el, function(i, e){
					values.delta[ind][i] = values.end[ind][i] - e;
				});
			});
			con.animate({ width : main.end.width }, {
				duration : 500,
				step : function(now, fx){
					var pos = 1/(main.end.width-main.start.width)*(now-main.start.width);
					var maincss = {};
					$.each(main.end, function(i, e){
						if (i != 'width'){
							maincss[i] = main.start[i] + pos*(e - main.start[i]);
						}
					});
					con.css(maincss);
					$.each(values.delta, function(ind, el){
						var css = {};
						$.each(el, function(i, e){
							css[i] = values.start[ind][i] + pos*e;
						});
						con.find('.'+ind).css(css);
					});
					var scrollwidth = values.start.jspPane.width + pos*values.delta.jspPane.width;
					f.reinitialiseScrollbar(elem, field, id);
				},
				complete : function(){
					f.reinitialiseScrollbar(elem, field, id);
					f.bindScrolling(elem, scrolling, field);
				}
			});
  		}
    };
    
    v = {
    	scrollbars : {},
		article : {},
		articles : {},
		menu : {},
		positions : {}
    };
    
    $.fn.schplitzing = function(method) {
  		if ( methods[method] ) {
      		return methods[method].apply( this, Array.prototype.slice.call( arguments, 1 ));
    	} else if ( typeof method === 'object' || ! method ) {
      		return methods.init.apply( this, arguments );
    	} else {
      		$.error( 'Method ' +  method + ' does not exist on jQuery.xbmc' );
    	}
    	    
	};
	
	$.fn.schplitzing.defaults = {
		schplitzingconnect : false,
		schplitzingorigin : false,
		debug : true,
		adminpath : 'admin/index.php',
		expand : false
	};
	
})( jQuery );
