(function( $ ){

	var methods = {
    	init : function( options ) {
    		if (location.host.search(/http/) != -1){
				$.fn.connecting.defaults.schplitzingconnect = location.host+location.pathname;
			} else {
				$.fn.connecting.defaults.schplitzingconnect = 'http://'+location.host+location.pathname;
			}
    		if ( options ) {
        		$.extend( $.fn.connecting.defaults, options );
      		}
      		opt = $.fn.connecting.defaults;
			f.initConnecting($(this), false);			
       	},
       	remove : function(){
       		opt = $.fn.connecting.defaults;
       		if (opt.connections){
       			$('#header_connections').addClass('show');
       		}
       		$(this).connecting.defaults.edit.remove();
       		$(this).connecting.defaults.container.remove();
       		$(this).connecting.defaults.container = false;
       		$(this).connecting.defaults.edit = false;
       	}
  	};
  	
  	var f = {
  		initConnecting : function(elem, data){
  			opt = elem.connecting.defaults;
  			if (typeof opt.container != 'object'){
  				elem.connecting.defaults.container = $('<div>', {
	  				id : 'connect'
	  			}).appendTo('body');
  			}
  			if (typeof data != 'object'){
  				data = {
  					method : 'list'
  				}
  			}
  			if ($('#header_connections').hasClass('show')){
  				$('#header_connections').removeClass('show');
  				elem.connecting.defaults.connections = true;
  			}
  			f.drawLoadingIndicator(elem);
  			console.log(data);
  			$.post(opt.schplitzingorigin+'admin/connect.php?szurl='+opt.schplitzingconnect, data, function(d){
  				console.log(d);
  				if (typeof opt.loading == 'object'){
  					opt.loading.removeClass('loading');
  				}
  				if (d.connected && !d.result){
  					f.drawHeader(elem, d);
  					f.drawLoginForm(elem, d);
  				} else if (!d.connected){
  					f.showMessage(elem, 'This SchplitZing is not connected');
  				} else {
  					elem.connecting.defaults.logindata = {
  						uid: data.uid,
						pwd: data.pwd
  					};
  					f.drawArticleList(elem, d);
  				}
  			}, 'json');
  		},
  		drawCloseButton : function(elem){
  			opt = elem.connecting.defaults;
  			if (typeof opt.container == 'object' && $('#close_connect').size() < 1){
  				$('<button>', {
	  				id : 'close_connect',
	  				html : 'close'
	  			}).addClass('txtbutton').prependTo(opt.container).bind('click', function(){
	  				elem.connecting('remove');
	  			});
	  			
  			}
  		},
  		drawLoadingIndicator : function(elem){
  			opt = elem.connecting.defaults;
  			if (typeof opt.container == 'object'){
	  			elem.connecting.defaults.loading = $('<div>', {
	  				id : 'loading_connect'
	  			}).prependTo(opt.container).addClass('loading');
	  		}
  		},
  		drawHeader : function(elem, data){
  			opt = elem.connecting.defaults;
  			if (typeof opt.container == 'object'){
  				opt.container.empty();
  				$('<div>', {
  					id : 'admin_header',
  					html : '<span class="sort_title">'+data.schplitzing+'</span><br><span class="header_author">'+data.author+'</span>'
  				}).appendTo(opt.container);
  				f.drawCloseButton(elem);
  			}
  		},
  		drawLoginForm : function(elem, data){
  			opt = elem.connecting.defaults;
  			if (typeof opt.container == 'object'){
  				if (typeof opt.edit == 'object'){
  					opt.edit.remove();
  				}
  				elem.connecting.defaults.edit = $('<div>',{
  					id : 'connect_edit',
  					html : '<div class="formheader articinfoleheader"><div class="formtools"><button class="txtbutton login" data-formid="#login_form" data-struct="login">login</button></div></div><div class="formblock textblock"><div class="label"><label class="formlabel" for="uid">Username</label></div><input type="text" name="uid" class="formfield" value="" /></div><div class="formblock textblock"><div class="label"><label class="formlabel" for="pwd">Password</label></div><input type="password" name="pwd" class="formfield" value="" /></div>'
  				}).appendTo(opt.container);
  				elem.connecting.defaults.edit.find('button.login').bind('click', function(){
  					dat = {
  						form: 'login',
						task: 'login',
						method: 'list',
						uid: $('#connect input[name="uid"]').val(),
						pwd: $('#connect input[name="pwd"]').val()
  					};
  					f.initConnecting(elem, dat);
  				});
  			}
  		},
  		drawArticleList : function(elem, data){
  			opt = elem.connecting.defaults;
  			if (typeof opt.edit == 'object'){
  				opt.edit.empty();
  			} else {
  				f.drawHeader(elem, data);
  				f.drawCloseButton(elem);
 				elem.connecting.defaults.edit = $('<div>',{
 					id : 'connect_edit'
 				}).appendTo(opt.container);
  			}
  			$.each(data.articles, function(i,field){
  				var fieldcontainer = $('<div>', {
  					class : 'connecting_fields_container',
  					html : '<div class="articlelist_header"><div class="articlelist_title">Field '+i+'</div></div>'
  				}).appendTo(opt.edit);
  				var articlelist = $('<ul>', {
  					class : 'articlelist'
  				}).appendTo(fieldcontainer).data('field', i);
  				$.each(field, function(s, article){
  					$('<li>', {
  						class : 'listed_article',
  						html : '<div class="template_icon">['+article.template+']</div><div class="article_title">'+article.title+'</div>'
  					}).appendTo(articlelist).data('id', article.id).data('sort', article.sort);
  				});
  			});
  			f.dragConnectArticles(elem);
  			f.sortConnectArticles(elem);
  		},
		dragConnectArticles : function(elem) {
  			opt = elem.connecting.defaults;
  			$(".article:not('#w1, #w2, #w3, #w4')").draggable({
  				start : function(){
  				
  				},
  				stop: function(event, ui) {
					
				},
				helper: function() {
					return $( "<div class='dragitem connect_article'>drag</div>" )[0];
				},
				cursorAt: { top: 0, left: 0 },
				connectToSortable: '.articlelist',
				revert:	'invalid',
				appendTo: 'body',
				zIndex: 10
			});
  			
  		},
  		sortConnectArticles : function(elem) {
  			opt = elem.connecting.defaults;
  			$( ".connecting_fields_container .articlelist" ).sortable({
				connectWith: ".article",
				cursor: 'pointer',
				dropOnEmpty: true,
				helper: function(e, ui) {
    						return $( "<div class='dragitem'>"+ui.html()+"</div>" )[0];
  						},
				appendTo: 'body',
				tolerance: 'pointer',
				placeholder: 'dragitem',
				stop: function(event, ui) {
					var newfield = ui.item.parents('.articlelist').data('field');
					var iem = ui.item.replaceWith(ui.placeholder);
					var dat = {
						id :	ui.item.attr('id')
					}
					if (typeof opt.loading == 'object'){
	  					opt.loading.addClass('loading');
	  				}
					$.post('admin/articleInfos.php', dat, function(data) {
						if (data.status){
							ui.placeholder.replaceWith('<li class="listed_article" data-id="0" data-sort="1"><div class="template_icon">['+data.template+']</div><div class="article_title">'+data.title+'</div></li>')
							var dat = {
								form: 'articles',
								task: 'save',
								method: 'add',
								id : 0,
								title : data.title,
								author : data.author,
								template : data.template,
								field : newfield,
								extern : 1,
								last_changed : data.last_changed
							};
							if (data.extern == 1){
								dat['extern_system'] = data.extern_system;
								dat['extern_id'] = data.extern_id;
								dat['extern_url'] = data.extern_url;
							} else {
								dat['extern_system'] = data.identifier;
								dat['extern_id'] = data.id;
								dat['extern_url'] = data.origin;
							}
							dat['extern_field'] = newfield;
							$.extend(dat, opt.logindata);
							console.log(dat);
							$.post(opt.schplitzingorigin+'admin/connect.php?szurl='+opt.schplitzingconnect, dat, function(d){
								console.log(d);
								$('.listed_article').each(function(){
									if (!$(this).data('id')){
										$(this).data('id', d.lastId);
									}
								});
								var j = 0;
				  				$('ul.articlelist').each(function(){
				  					j++;
									var i = 1;
									var sort = {};
									$(this).find('.listed_article').each(function(){
										$(this).data('sort', i);
										sort[i] = $(this).data('id');
										i++;
									});
									var da = {
										form: 'articles',
										task: 'position',
										method: 'sort',
										field: $(this).data('field'),
										sort: sort
									}
									$.extend(da, opt.logindata);
									$.post(opt.schplitzingorigin+'admin/connect.php?szurl='+opt.schplitzingconnect, da, function(data) {
										if (j == $('ul.articlelist').size()){
											if (typeof opt.loading == 'object'){
							  					opt.loading.removeClass('loading');
							  				}
										}
									}, 'json');
								});
				  				
				  			}, 'json');							
						}
					}, 'json');
					
				}			
			});
  		},
  		showMessage : function(elem, string){
			opt = elem.connecting.defaults;
			if (typeof opt.container == 'object'){
				$('<div>', {
					class : 'error',
					html : string
				}).appendTo(opt.container);
			} else {
				alert(string);
			}	
		}
	}
  	
	$.fn.connecting = 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.connecting.defaults = {
		structure : 'connect',
		container : false,
		edit : false,
		loading : false,
		adminpath : '',
		logindata : false,
		jscrolloptions : {
			autoReinitialise: false,
			animateScroll: true
		},
		jscrollpanes : {},
		schplitzingid : false,
		schplitzingpass : false,
		schplitzingconnect : false,
		schplitzingconnected : false,
		schplitzingorigin : false,
		lastlogin : false,
		connections : false
	};
	
})( jQuery );
