var Dogfinder = (function($) {


$(document).ready(function(){
  
  
  doAjaxLinks();
  
  dogfinder_flappen();
  
  initAjaxLetters();
  
  $('.dogfinder_wrap .swf').swfElement();
  
  var dogfinderLetter = $.url().param('tx_mmcdogfinder_pi1[letter]');
  if(dogfinderLetter){
    $('.dogfinder_tabs li .search_letter').click();
  }
  
  if (location.pathname.search(/^\/hunderassen/) > -1) {
    $('.dogfinder_tabs li .search_letter').click();
  } else {
    $('.dogfinder_tabs li .search_kriterien').click();
  }
  
});

function log(msg) {
	window.console && window.console.log(msg);
}



function dogfinder_flappen() {
	var $df_tabs = $('.dogfinder_tabs ul li a');
	
	var search_kriterien_explanation = '<p>Während Sie die Fragen beantworten, werden Ihnen Zwischenergebnisse an Hunderassen gezeigt. Bitte beachten Sie jedoch, dass Sie Ihre optimalen Ergebnisse erst beim Beantworten aller Fragen erhalten und dass diese Empfehlungen nur allgemeinen Charakter haben und eine intensive Beratung und das persönliche Kennenlernen nicht ersetzen können. Informieren Sie sich immer ausführlich beim bisherigen Halter über die Vorgeschichte und die besonderen Eigenheiten eines Hundes, bevor Sie ihn bei sich aufnehmen.</p>';
  var $search_kriterien_explanation = $(search_kriterien_explanation).prependTo('.dogfinder_results').hide();
  
  var df_tabs_changehandler = function(newActive) {
    if (newActive.hasClass('search_kriterien')) {
      $search_kriterien_explanation.show();
    } else {
      $search_kriterien_explanation.hide();
    }
  }
  
  	
	$df_tabs.click(function(e){
		e.preventDefault();
		e.stopPropagation();
		var $parent_click = $(this).parent();
		var parent_click_index = $parent_click.index('.dogfinder_tabs ul li');
		
		if(!$parent_click.hasClass('active')) {
			$parent_click.addClass('active').siblings().removeClass('active');
			var $item = $parent_click.parents('.dogfinder_wrap').find('.search_wrap>div');
			$item.eq(parent_click_index).show().siblings().hide();
			df_tabs_changehandler($(this));
		}
			
		return false;
	});

	
}



function doAjaxLinks() {
	$('a.show_results').bind('click', function() {
		$('.ajax_content').hide();
		$('.dogfinder_results').show();
		return false;
	});
	$('.dogfinder_results a.ajax').bind('click',function() {
		$('.dogfinder_results').hide();
		$('.ajax_content .dogName').text($(this).attr('title'));
		showLoading();
		
		var ajaxUrl = $(this).attr('href') + '?type=9 #main_content > *';
		if($(this).attr('href').indexOf('?')) {
			ajaxUrl = $(this).attr('href') + '&type=9 #main_content > *';
		}

		$('.ajax_content .main_content').load(ajaxUrl, function() {
			//$('.ajax_content .main_content .tablewrap').hide();
			hideLoading();
			$('.ajax_content').show();
		});

		return false;
	});
	
	$('.dogfinder_results a.mehrErgebnisse').bind('click',function() {
		$('.dogfinder_results').slideUp(100);
		showLoading();
		
		var ajaxUrl = $(this).attr('href') + '&type=9 .dogfinder_results';
		if($(this).attr('href').indexOf('?')) {
			ajaxUrl = $(this).attr('href') + '&type=9 .dogfinder_results';
		}

		$('.dogfinder_results').load(ajaxUrl, function() {
			$('.dogfinder_results .dogfinder_results').removeClass('dogfinder_results');
			$('div.more_results').hide();
			doAjaxLinks();
			hideLoading();
			$('.dogfinder_results').slideDown(1000);
		});
		
		
		
		return false;
	});
}

function updateDogList(result) {
  $('.ajax_content').hide();
  var querystring = '&random=' + Math.random();
  for ( var item in result ) {
  	if (item != 0 && result[item] != undefined) {
		querystring = querystring + '&tx_mmcdogfinder_pi1[antworten]['+item+']='+result[item];
	}
	
  	
  }

  $('.dogfinder_results').hide();
	showLoading();
	$('.dogfinder_results').load('/index.php?id=2518&no_cache=1&type=9' + querystring +' .dogfinder_results',function() {
//	$('.dogfinder_results').load('/?815&no_cache=1&type=9' + querystring +'',function() {
		$('.dogfinder_results .dogfinder_results').removeClass('dogfinder_results');
		$('div.more_results').show();
		//$('.dogfinder_results').fadeIn(1000);
		hideLoading();
		$('.dogfinder_results').slideDown(800);
		doAjaxLinks()
	});
}



function initAjaxLetters() {
  $('.letter_list li:not(.disabled) a').click(function(e){
    e.preventDefault();
    e.stopPropagation();
    $('.ajax_content .show_results').click();
    var $this = $(this);
    $this.parent().addClass('active').siblings().removeClass('active');
    var href = $this.attr('href');
    $('.dogfinder_results').empty();
    showLoading();
    $('.dogfinder_results').load(href+' .dogfinder_results', function() {
      $('.dogfinder_results .dogfinder_results').removeClass('dogfinder_results');
      hideLoading();
      doAjaxLinks();
    });

    return false;
  });
  
}




function showLoading() {
	$('.tx-mmcdogfinder-pi1 .laden').show();
}

function hideLoading() {
	$('.tx-mmcdogfinder-pi1 .laden').hide();
}

function dump(arr,level) {
	var dumped_text = "";
	if(!level) level = 0;
	
	//The padding given at the beginning of the line.
	var level_padding = "";
	for(var j=0;j<level+1;j++) level_padding += "    ";
	
	if(typeof(arr) == 'object') { //Array/Hashes/Objects 
		for(var item in arr) {
			var value = arr[item];
			
			if(typeof(value) == 'object') { //If it is an array,
				dumped_text += level_padding + "'" + item + "' ...\n";
				dumped_text += dump(value,level+1);
			} else {
				dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
			}
		}
	} else { //Stings/Chars/Numbers etc.
		dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
	}
	return dumped_text;
}
  
  // Expose updateDogList for Flash usage
  return {
    updateDogList: function(result) {
      updateDogList(result);
    }
  }


})(jQuery);



// Expose updateDogList for Flash
function updateDogList(result) {
  Dogfinder.updateDogList(result);
}




/* SWF Element needs the following Markup Structure:
<a href="http://your.link/here" data-swf="http://path.to/swf" class="swf">
  <!-- div will be replaced by flash --> 
  (<div>)
    flash fallback content (i.e. image)
  (</div>)
</a>
also possible to use <div> instead of <a> 
*/
(function( $ ){
  var methods = {
      init : function( o ) {
      return this.each(function(){
        var $this = $(this);
        var unique_id = getUniqueId();
        
        var flashvars = $.unserialize($this.attr('data-flashvars'));
        var params = $.unserialize($this.attr('data-params'));
        var attributes = $.unserialize($this.attr('data-attributes'));
        
        var default_flashvars = {
          clicktag: $this.attr('href')
        };
        var default_params = {
          allowFullscreen: true,
          allowScriptAccess: 'always',
          wmode: 'transparent'
        };
        var default_attributes = {
          id: unique_id,
          name: unique_id
        };
        
        flashvars = $.extend(false, default_flashvars, flashvars);
        params = $.extend(false, default_params, params);
        attributes = $.extend(false, default_attributes, attributes);
        
        var defaults = {
          swfUrl: $this.attr('data-swf'),
          width: "100%",
          height: "100%",
          flashvars: flashvars,
          params: params,
          attributes: attributes,
          callback: null
        }
        
        var options = $.extend(true, defaults, o);    
        $this.width($this.width());
        $this.height($this.height());
        var fallbackMarkup = $this.html();
        $this.html('');
        var $container = $('<div id="'+options.attributes.id+'"></div>').appendTo($this);
        var width = "100%";
        var height = "100%";
        swfobject.embedSWF(options.swfUrl, options.attributes.id, options.width, options.height, "9.0.0",false, options.flashvars, options.params, options.attributes, swfEmbedCallback);
        function swfEmbedCallback(e){
          if (e.success) {
            //$this.children().not(e.ref).remove();
            $this.removeAttr('href');
          } else {
            //$container.remove();
            $this.html(fallbackMarkup);
          }
          if (options.callback) 
            options.callback.call($this, e);
        }
      });
    }
  };
  function getUniqueId() {
    var jetzt = new Date();
    return "id_"+jetzt.getTime();
  }
  $.fn.swfElement = function( method ) {
      // Method calling logic
      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.swfElement' );
      }  
  };
})( jQuery );
/* unserialize decodes strings of kind a=1&b=2&c=3... to an object */
(function($) {
    $.unserialize = function(str) {
      if (str) {
        var item_pairs = str.split('&');
        var obj = new Object();
        $.each(item_pairs, function(index, val){
          var item_splitted = val.split('=');
          obj[item_splitted[0]] = item_splitted[1];
        });
        return obj;
      } else {
        return false;
      }
    };
})(jQuery);













// JQuery URL Parser plugin - https://github.com/allmarkedup/jQuery-URL-Parser
// Written by Mark Perkins, mark@allmarkedup.com
// License: http://unlicense.org/ (i.e. do what you want with it!)

;(function($, undefined) {
    
    var tag2attr = {
        a       : 'href',
        img     : 'src',
        form    : 'action',
        base    : 'href',
        script  : 'src',
        iframe  : 'src',
        link    : 'href'
    },
    
  key = ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","fragment"], // keys available to query
  
  aliases = { "anchor" : "fragment" }, // aliases for backwards compatability

  parser = {
    strict  : /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,  //less intuitive, more accurate to the specs
    loose   :  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // more intuitive, fails on relative paths and deviates from specs
  },
  
  querystring_parser = /(?:^|&|;)([^&=;]*)=?([^&;]*)/g, // supports both ampersand and semicolon-delimted query string key/value pairs
  
  fragment_parser = /(?:^|&|;)([^&=;]*)=?([^&;]*)/g; // supports both ampersand and semicolon-delimted fragment key/value pairs
  
  function parseUri( url, strictMode )
  {
    var str = decodeURI( url ),
        res   = parser[ strictMode || false ? "strict" : "loose" ].exec( str ),
        uri = { attr : {}, param : {}, seg : {} },
        i   = 14;
    
    while ( i-- )
    {
      uri.attr[ key[i] ] = res[i] || "";
    }
    
    // build query and fragment parameters
    
    uri.param['query'] = {};
    uri.param['fragment'] = {};
    
    uri.attr['query'].replace( querystring_parser, function ( $0, $1, $2 ){
      if ($1)
      {
        uri.param['query'][$1] = $2;
      }
    });
    
    uri.attr['fragment'].replace( fragment_parser, function ( $0, $1, $2 ){
      if ($1)
      {
        uri.param['fragment'][$1] = $2;
      }
    });
        
    // split path and fragement into segments
    
        uri.seg['path'] = uri.attr.path.replace(/^\/+|\/+$/g,'').split('/');
        
        uri.seg['fragment'] = uri.attr.fragment.replace(/^\/+|\/+$/g,'').split('/');
        
        // compile a 'base' domain attribute
        
        uri.attr['base'] = uri.attr.host ? uri.attr.protocol+"://"+uri.attr.host + (uri.attr.port ? ":"+uri.attr.port : '') : '';
        
    return uri;
  };
  
  function getAttrName( elm )
  {
    var tn = elm.tagName;
    if ( tn !== undefined ) return tag2attr[tn.toLowerCase()];
    return tn;
  }
  
  $.fn.url = function( strictMode )
  {
      var url = '';
      
      if ( this.length )
      {
          url = $(this).attr( getAttrName(this[0]) ) || '';
      }
      
        return $.url( url, strictMode );
  };
  
  $.url = function( url, strictMode )
  {
      if ( arguments.length === 1 && url === true )
        {
            strictMode = true;
            url = undefined;
        }
        
        strictMode = strictMode || false;
        url = url || window.location.toString();
                            
        return {
            
            data : parseUri(url, strictMode),
            
            // get various attributes from the URI
            attr : function( attr )
            {
                attr = aliases[attr] || attr;
                return attr !== undefined ? this.data.attr[attr] : this.data.attr;
            },
            
            // return query string parameters
            param : function( param )
            {
                return param !== undefined ? this.data.param.query[param] : this.data.param.query;
            },
            
            // return fragment parameters
            fparam : function( param )
            {
                return param !== undefined ? this.data.param.fragment[param] : this.data.param.fragment;
            },
            
            // return path segments
            segment : function( seg )
            {
                if ( seg === undefined )
                {
                    return this.data.seg.path;                    
                }
                else
                {
                    seg = seg < 0 ? this.data.seg.path.length + seg : seg - 1; // negative segments count from the end
                    return this.data.seg.path[seg];                    
                }
            },
            
            // return fragment segments
            fsegment : function( seg )
            {
                if ( seg === undefined )
                {
                    return this.data.seg.fragment;                    
                }
                else
                {
                    seg = seg < 0 ? this.data.seg.fragment.length + seg : seg - 1; // negative segments count from the end
                    return this.data.seg.fragment[seg];                    
                }
            }
            
        };
        
  };
  
})(jQuery);
