jQuery.transform = 
{
	queryStack: [],
	
	abort: function ( )
	{
		jQuery.each ( jQuery.transform.queryStack, function ( i, val )
		{
			val.abort ( );
		} );
	},
	
	execute: function ( xml, xsl, callback, onBeforeStart )
	{
		/**
		 * Check Params:
		 */
			if ( typeof onBeforeStart == 'function' ) onBeforeStart ( );
		 
			switch ( typeof xml )
			{
				case 'string':
					xml = { doc: null, url: xml, params: {}, method: 'get' };
					break;
					
				case 'object':
					xml = jQuery.extend ( { doc: null, url: '', params: {}, method: 'get' }, xml );				
					break;
			}
		 
			switch ( typeof xsl )
			{
				case 'string':
					xsl = { doc: null, url: xsl, params: {}, method: 'get' };
					break;
					
				case 'object':
					xsl = jQuery.extend ( { doc: null, url: '', params: {}, method: 'get' }, xsl );
					break;
			}
		
		/**
		 * fill xml:
		 */
			if ( xml.doc == null )
			{
				jQuery.transform.queryStack.push ( ( xml.method == 'get' ? $.get : $.post ) ( xml.url, xml.params, function ( response, status ) 
				{
					xml.doc = response;
					xml.status = status;
						
					if ( status == 'success' ) jQuery.transform.execute ( xml, xsl, callback );
					else callback ( null, 'xml error', xml, xsl );
				
				}, 'xml' ) );
			}			
	
		/**
		 * fill xsl:
		 */
			else if ( xsl.doc == null )
			{
				jQuery.transform.queryStack.push ( ( xsl.method == 'get' ? $.get : $.post ) ( xsl.url, xsl.params, function ( response, status ) 
				{
					xsl.doc = response;
					xsl.status = status;
						
					if ( status == 'success' ) jQuery.transform.execute ( xml, xsl, callback );
					else callback ( null, 'xsl error', xml, xsl );
				
				}, 'xml' ) );
			}
	
		/**
		 * transform:
		 */
			else
			{
				var resultString = '';
			
				if ( window.ActiveXObject )
				{
					resultString = xml.doc.transformNode ( xsl.doc );				
				}
				else if ( document.implementation && document.implementation.createDocument )
				{
					xsltProcessor = new XSLTProcessor ( );
					xsltProcessor.importStylesheet ( xsl.doc );
		
					var tmp = document.createElement ( 'DIV' );
						tmp.appendChild ( xsltProcessor.transformToFragment ( xml.doc, document ) );	
				
					resultString = tmp.innerHTML;
				}
				
				callback ( resultString, 'success', xml, xsl );
			}
			
		/**
		 * jQuery - plugin requirement
		 */
			return this;
	}
};

jQuery.fn.xslt = function ( xml, xsl, onComplete, onBeforeStart )
{
	var self = this;

	return this.each ( function ( )
	{
		jQuery.transform.execute ( xml, xsl, function ( resultString, status )
		{
			if ( status == 'success' )
			{
				$(self).fadeOut(function()
				{					
					$(self).html ( resultString );
					$(self).fadeIn ( 'slow', onComplete );					
				})
			}	
				
		}, onBeforeStart );
	} );
};
var AjaxLoader = new (function( )
{
	this.path = null;
	this.css = null;

	this.show = function ( parentElement )
	{
		var x = $('<img />').attr (
		{
			src: this.path,
			className: 'ajax-loader'
		}
		
		).css ( this.css ).appendTo ( parentElement );
	}
	
	this.hide = function ( )
	{
		$('.ajax-loader').remove();
	}
})();
var Search = new (function()
{
	var self = this;
	
	var query = null;
	var queryWait = null;
	var prevQueryString = '';
	
	var delay = 1000;

	this.init = function ( searchId, inputId, inputOrderNrId, paths )
	{
		// IDs speichern:
			this.searchId = '#' + searchId;
			this.inputId = '#' + inputId;
			this.inputOrderNrId = '#' + inputOrderNrId;
			
			this.searchUrl = paths.search;
			this.productGroupUrl = paths.productGroup;
			this.resultListXSLUrl = paths.resultListXSL;
			this.productGroupXSLUrl = paths.productGroupXSL;
			this.orderNrSearchResultXSLUrl = paths.orderNrSearchResultXSL;
			
		// Input feld aktivieren:
			activateInput ( );
			activateOrderNrInput ( );
			
		// Evtl. url-hash:
			if ( window.location.hash.length > 1 )
			{
				$(self.inputId).attr('value',unescape(window.location.hash.substr(1)));
				doSearch ( $(self.inputId).attr('value'), 'default' );
			}
	}
	
	function abort ( )
	{
		if ( query ) query.abort ( );
		if ( queryWait ) window.clearTimeout ( queryWait );
		
		AjaxLoader.hide();
	}
	
	this.replaceQuery = function ( from, to )
	{
		$(self.inputId).attr('value',$(self.inputId).attr('value').replace(from, to));		
		doSearch ( $(self.inputId).attr('value'), 'default' );
	}
	
	function activateInput ( )
	{
		$(self.inputId).keyup(function()
		{
			var queryString = $.trim ( this.value );
		
			if ( queryString.length > 1 && queryString != prevQueryString )
			{
				abort ( );
			
				prevQueryString = queryString;			
				queryWait = window.setTimeout ( function ( ) { doSearch ( prevQueryString, 'default' ); }, delay );
			}
		});
	}
	
	function activateOrderNrInput ( )
	{
		$(self.inputOrderNrId).keyup(function()
		{
			var queryString = $.trim ( this.value );
		
			if ( queryString.length > 1 && queryString != prevQueryString )
			{
				abort ( );
			
				prevQueryString = queryString;			
				queryWait = window.setTimeout ( function ( ) { doSearch ( prevQueryString, 'ordernr' ); }, delay );
			}
		});
	}
	
	function doSearch ( queryString, type )
	{
		abort ( );
		AjaxLoader.show($('#search'));

		switch ( type )
		{
			case 'default':
				window.location.hash = queryString;
		
				query = $.transform.execute
				(
					{ url: self.searchUrl, params: { query: queryString, type: type } },
					{ url: self.resultListXSLUrl },
					function ( string )
					{
						AjaxLoader.hide();
							
						$('#results').hide ( );
						$('#results').html ( string );
					
						$('#search-results').show ( );
						$('#results').show ( );
						
						var badBrowser = (/MSIE ((5\.5)|6)/.test(navigator.userAgent) && navigator.platform == "Win32");
						var results = badBrowser ? $('#search-results').children('div') : $('.result');
						
						$.each ( results, function ( i, val )
						{
							// div.label CData in HTML parsen:
								$(val).find('.label').html ( $(val).find('.label').text() );
							
							// Produkt-Gruppe laden:	
								$(val).click(function()
								{
									$(self.resultsId).children().removeClass ( 'active' );
									$(this).addClass ( 'active' );			
									displayProductGroup ( this, $(val).find('input[type=hidden]').attr('value') );
								});
						} );
					}
				);
				break;				
				
			case 'ordernr':
				query = $.transform.execute
				(
					{ url: self.searchUrl, params: { query: queryString, type: type } },
					{ url: self.orderNrSearchResultXSLUrl },
					function ( string )
					{
						AjaxLoader.hide();
								
						$('#results').hide ( );
						$('#results').html ( string );
					
						$('.further-information-toggle' ).click ( function ( )
						{
							var fi = $(this).parent().find('.further-information');
							
							if ( $(fi).is(':visible') ) $(fi).slideUp();
							else $(fi).slideDown();
						} );
					
						$('#results').show ( );
						$('#search-results').slideDown ( 'slow' );
					}
				);
				break;
		}
	}
	
	this.exec = doSearch;
	
	function displayResults ( xmlDoc )
	{
		abort ( );
		$(self.resultsId).slideUp
		(
			'slow', function ( )
			{
				query = $.transform.execute ( { doc: xmlDoc }, { url: self.resultListXSLUrl }, function ( string )
				{
					$(self.resultsId).hide ( );
					$(self.resultsId).html ( string );
					
					$.each ( $(self.resultsId).find('.result'), function ( i, val )
					{
						// div.label CData in HTML parsen:
							$(val).find('.label').html ( $(val).find('.label').text() );
						
						// Produkt-Gruppe laden:	
							$(val).click(function()
							{
								$(self.resultsId).children().removeClass ( 'active' );
								$(this).addClass ( 'active' );			
								displayProductGroup ( this, $(val).find('input[type=hidden]').attr('value') );
							});
					} );
					
					$(self.resultsId).slideDown ( 'slow' );
				} );
			}
		);
	}
	
	function displayProductGroup ( element, productGroupName )
	{
		//$('.product-group').slideUp(function(){$(this).remove()});
		
		if ( ! element.isLoaded )
		{
			abort ( );
			AjaxLoader.show(element);
			
			element.isLoaded = true;
			
			query = $.transform.execute ( { url: self.productGroupUrl, params: { group: productGroupName } }, { url: self.productGroupXSLUrl }, function ( string )
			{
				AjaxLoader.hide ( );			
				
				var productGroup = $('<div class="product-group" />').hide();
					productGroup.html ( string );
				
					productGroup.find ( '.further-information-toggle' ).click ( function ( )
					{
						var fi = $(this).parent().find('.further-information');
						
						if ( $(fi).is(':visible') ) $(fi).slideUp();
						else $(fi).slideDown();
					} );
				
				$(element).after ( productGroup );
				productGroup.slideDown();
			} )
		}		
	}
})();
var Suggest = new (function()
{
	var self = this;

	var query = null;

	this.init = function ( inputId, paths )
	{
		// IDs speichern:
			this.inputId = '#' + inputId;
		
		// Pfade:
			this.dataUrl = paths.data;
			this.xslUrl = paths.xsl;
			
		// Input feld aktivieren:
			activateInput ( );
	}
	
	function abort ( )
	{
		if ( query ) query.abort ( );
	}
	
	function activateInput ( )
	{
		$(this.inputId).keyup(function()
		{
			abort ( );
			$('#suggestions').remove();
				
			query = $.transform.execute ( { url: self.dataUrl, params: { query: $(self.inputId).attr('value') } }, { url: self.xslUrl }, function ( string )
			{
				$(string).appendTo($(self.inputId).parent());
				
				$('#suggestions').css({					
					top: $(self.inputId).position().top + 21,
					left: $(self.inputId).position().left				
				});
				
				$('#suggestions a').click ( function ( )
				{
					Search.exec ( $(this).text(), 'default' );
					$('#suggestions').remove();
				} );
			} );
		});
	}
})();
var BiozolCart = new (function( )
{
	this.add = function ( id )
	{
		$.get ( '/plugins/search/product.php', { id: id }, function ( response, status )
		{
			if ( status == 'success' )
			{
				var data = {				
					id: 		$(response).find('id').text(),
					orderNr:	$(response).find('Artikelnummer').text(),
					label:		$(response).find('Artikelbezeichnung').text() + ' ' + $(response).find('unit').text(),
					price: 		$(response).find('Verkaufspreis').text(),
					tax: 		0.19,
					is_taxed: 	0,
					amount: 	1
				};
			
				$.post ( '/cartAddExternal2.php', data, function ( response, status )
				{
					if ( response != '0' )
					{
						// Anzeige aktualisieren 
						var values = response.split('|', 2);
						$("#value_cartentries").text(values[0]);
						$("#value_carttotal").text(values[1]+' EUR');
						$("#cartmessagetxt").text('Sie haben den Artikel '+data['label']+' in den Warenkorb gelegt.');
						// Hintergrund gelb...weiss
						$("#box-cart-preview").animate({backgroundColor: "#ffa858"}, 200).animate({backgroundColor: "#ffffff"}, 2500);
						// Pop-up
						$("#cartmessage").css('top' , ( $(window).height() - $("#cartmessage").height() ) / 2 + $(window).scrollTop() + 'px');
						$("#cartmessage").css('left', ( $(window).width() -  $("#cartmessage").width()  ) / 2 + $(window).scrollLeft() + 'px');
						$("#cartmessage").fadeIn('fast').delay(3000).fadeOut('fast');
						// alt: // window.location.reload ( );
					}
					else
					{
						alert ( 'Fehler beim Hinzufügen des Artikel zum Warenkorb.' );
					}
				} );
			}
		} );
	}
})();


var BiozolOrder = new (function( )
{
	this.dataSheet = function ( id )
	{
		var params = getUrlParams ( );
		
		params.o = 12267;
		params._ds = id;

//		window.location.search = params._toString ( );
		var newurl = window.location.protocol+'//'+window.location.host+'/'+params._toString ( );
		window.location = newurl;
	}
})();
