// Settings
var url = window.location;
var urlScheme = url.protocol.toLowerCase();
var urlHost = url.host;
var actUnitUrl = "/out/schiesser/src/js/";
var actSizeUrl = "/out/schiesser/src/js/";
if(urlScheme == "https" || urlScheme == "https:") {
	
	actUnitUrl = "https://" + urlHost + "/out/schiesser/src/js/";
	actSizeUrl = "https://" + urlHost + "/out/schiesser/src/js/";
}

var schiesser_data = {
	errorHandler: {
		header: "",
		text: ""
	},
	collision: {
	},
	categories: {
		cupdrag: 'tops',
		bustdrag: 'tops',
		waistdrag: 'underwear',
		hipdrag: 'underwear',
		hipdragmen: 'men',
		kidsdrag: 'kids',
		waistdragmen: 'men',
		cupdragmen: 'men'
	},
	unitUrl: actUnitUrl,
	sizeUrl: actSizeUrl,	
	/*country: 'de',*/
	unit: 'cm' 
};

// used to check if all ajax requests have completed
// increment by one for every ajax request made in the application
// fired is used to call checkSize() method only once and on every handler event
var complete = 2;
var fired = false;

// getFitted plugin
(function($){
	if(!document.defaultView || !document.defaultView.getComputedStyle){ // IE6-IE8
		var oldCurCSS = jQuery.curCSS;
		jQuery.curCSS = function(elem, name, force){
			if(name === 'background-position'){
				name = 'backgroundPosition';
			}
			if(name !== 'backgroundPosition' || !elem.currentStyle || elem.currentStyle[ name ]){
				ret = oldCurCSS.apply(this, arguments);
				return ret;
			}
			ret = oldCurCSS.call(this, elem, 'backgroundPositionX', force) +' '+ oldCurCSS.call(this, elem, 'backgroundPositionY', force);
			return ret;
		};
	}

	
	
	$.widget(
			'ui.fittedSlider', 
			$.extend(
					{}, 
					$.ui.mouse,
					{
						init: function(){
							// VARIABLES 
							this.ui = {
									parent: {
										self: this.element.parents('div.drag-wrapper:first')
									},
									valElm: this.element.find('div.value:first'),
									posBG: this.element.css('backgroundPosition'),
									positions: {}
							};
							this.ui.parent = $.extend({}, this.ui.parent, {
								bodyPart: this.ui.parent.self.attr('id'),
								valElm2: this.ui.parent.self.find('strong:first'), // , span.value-size
								more: this.ui.parent.self.find('a.more:first'),
								less: this.ui.parent.self.find('a.less:first')
							});
							this.ui.valX = this.ui.posBG.substring(0, this.ui.posBG.indexOf('px'));
							this.ui.posBG = this.ui.posBG.substring(this.ui.valX.length, this.ui.posBG.length);
							this.ui.valX = parseInt(this.ui.valX, 10);
							this.curVal = parseInt(this.ui.valElm.html(), 10);
							// EVENTS
							var that = this;
							this.ui.parent.more.bind('click', 
									function(e) {
										that.element.triggerHandler('sliderChange', {val: $.ui.fittedSlider.defaults.steps});
										return false;
									}
							);
							this.ui.parent.less.bind('click', 
									function() { 
										that.element.triggerHandler('sliderChange', {val: -$.ui.fittedSlider.defaults.steps});
										return false;
									}
							);
							
							
							this.element.bind('sliderChange', function(e, data){
								that.changeSlider(e, data);
							});
							
							//METHODS
							this.mouseInit();
							this.handleHoverHandles();
							
						},
						
						changeSlider: function(e, data) {
							var dims = $.ui.fittedSlider.defaults.dimensions;
							if((this.curVal + data.val/$.ui.fittedSlider.defaults.steps) >= dims[this.ui.parent.bodyPart].minimum && 
									(this.curVal + data.val/$.ui.fittedSlider.defaults.steps) <= dims[this.ui.parent.bodyPart].maximum) {
								this.ui.valX -= data.val;
								this.element.css({
									backgroundPosition: (this.ui.valX) + this.ui.posBG
								});
								this.curVal += data.val/$.ui.fittedSlider.defaults.steps;
								this.ui.valElm.html(parseInt(this.curVal, 10));
								this.ui.parent.valElm2.html(parseInt(this.curVal, 10)+$.ui.fittedSlider.defaults.unit);
								this.element.triggerHandler('sliderUpdate', {elm: this});
							}
						},
						
						handleHoverHandles: function() {
							this.element.hover(function() {
								var moveableElm = $('div.fitted-zoom-inner', '#container-1'),
										elm = $('div.active-drag')
													.removeClass('active-drag')
													.attr('id');
								$('span[rel="'+elm+'"]', '#container-1')
									.removeClass(''+elm+'-line-active');
								var newElm = $(this)
									.parents('div.drag-wrapper')
									.addClass('active-drag')
									.attr('id');

								if(newElm === 'waistdrag' || newElm === 'hipdrag') {
									moveableElm
										.animate({top: '-81px'}, {duration: 200});
								} else {
									moveableElm
										.animate({top: '0px'}, {duration: 200});
								}
								
								$('span[rel="'+newElm+'"]', '#container-1')
								.addClass(''+newElm+'-line-active');
								
							}, function() {});
						},
						
						mouseStart: function(e) {
							this.ui.positions.startX = e.pageX;
						},
						
						mouseDrag: function(e) {
							this.element.triggerHandler('sliderChange', {val: parseInt((this.ui.positions.startX - e.pageX), 10)});
							this.ui.positions.startX = e.pageX;
						},
						
						updateNewUnits: function() {
							this
								.ui
								.parent
								.valElm2
								.html(
										$.ui.fittedSlider.defaults.dimensions[this.ui.parent.bodyPart].defaults + '' + 
										$.ui.fittedSlider.defaults.unit);
							this
								.ui
								.valElm
								.html(
										$.ui.fittedSlider.defaults.dimensions[this.ui.parent.bodyPart].defaults);
							
							
							this.curVal = $.ui.fittedSlider.defaults.dimensions[this.ui.parent.bodyPart].defaults;
							
							this
								.element
								//.css({backgroundPosition: this.ui.valX+''+this.ui.posBG});
								.removeAttr('style')
							
							if(!this.element.is('.drag-inner-'+$.ui.fittedSlider.defaults.unit)) {
								this.element
									.removeClass('drag-inner-cm')
									.removeClass('drag-inner-in')
									.addClass('drag-inner-'+$.ui.fittedSlider.defaults.unit);
							}
							this.ui.posBG = this.element.css('backgroundPosition');
							this.ui.valX = this.ui.posBG.substring(0, this.ui.posBG.indexOf('px'));
							this.ui.posBG = this.ui.posBG.substring(this.ui.valX.length, this.ui.posBG.length);
							this.ui.valX = parseInt(this.ui.valX, 10);
						}
					}
			)
	);
	
	
	$.widget(
			'ui.getFitted', 
			$.extend(
					{},
					{
						init: function(e) {
							if($('#cupdrag').length !== 0) {
								var that = this;
								this.errors = [true, true];
								this.slider = [];
								this.errorCode = '';
								this.unit = schiesser_data.unit;
								this.country = schiesser_data.country;
								this.getSizeTable(this.unit, this.country);
								this.getUnitDimensions(this.unit);
								
								this.braSize = $('span#bra-size', this.element);
								this.slipSize = $('span#slip-size', this.element);
								this.kidSize = $('span#kids-size', this.element);
								this.menSize = $('span#men-size', this.element);
								this.menSize2 = $('span#men-size2', this.element);
								
								var self = this;
								this.forms = $('#unit-filter, #country-filter')
									.each(function() {
									var that = this;
									$(this)
										.unbind('submit')
										.bind('submit', function() {return false;})
										.find('ul.ui-menubar ul li')
										.bind('menuitemclick', function() {
											var val = $(this).find('span:first').attr('data-value');
											if(that.id === "unit-filter") {
												self.unit = val;
											}
											else if(that.id === "country-filter") {
												self.country = val;
											}
											self.getSizeTable(self.unit, self.country);
											self.getUnitDimensions(self.unit);
											return false;
										});
									});
							}
						},
						getUnitDimensions: function(unit) {
							var that = this;
							$.ajaxSetup({"error":function(XMLHttpRequest,textStatus, errorThrown) {   
							      $('body').append('<div id="getUnitDimensionsError" style="display:none;">textStatus: '+ textStatus + '<br /><br /> errorThrown: ' +errorThrown + '<br /><br /> XMLHttpRequest.responseText: ' + XMLHttpRequest.responseText + '</div>');
							}});
							
							$.getJSON($.ui.getFitted.defaults.unitUrl+unit+".json", function(json){
								that.unitSuccess.apply(that, arguments);
							    complete--;
							});
						},
						
						getSizeTable: function(unit, country) {
							var that = this;
							$.ajaxSetup({"error":function(XMLHttpRequest,textStatus, errorThrown) {   
							      $('body').append('<div id="getSizeTableError" style="display:none;">textStatus: '+ textStatus + '<br /><br /> errorThrown: ' +errorThrown + '<br /><br /> XMLHttpRequest.responseText: ' + XMLHttpRequest.responseText + '</div>');
							}});
							
							$.getJSON($.ui.getFitted.defaults.sizeUrl+country+unit+".json", function(json){
								that.sizeSuccess.apply(that, arguments);
								complete--;
							});
						},
						
						unitSuccess: function(data, stat, xhr) {
							var that = this;
							data = data.data;
							
							$.ui.fittedSlider.defaults = $.extend({}, $.ui.mouse.defaults, data.schiesser_dimensions);
							$.ui.getFitted.defaults = $.extend({}, $.ui.getFitted.defaults, data);
							
							$('div.drag-inner', this.element).each(function(i) {
								$(this)
									.fittedSlider()
									.bind('sliderUpdate', that, that.handleUpdatedSlider);
								that.slider.push($(this).data('fittedSlider'));
								$(this).data('fittedSlider').updateNewUnits();
								if(i%2) {
									$(this).data('fittedSlider').element.triggerHandler('sliderUpdate', {elm: $(this).data('fittedSlider')});
								}
							});
							
						}, 
						
						sizeSuccess: function(data, stat, xhr) {
							var that = this;
							data = data.data;
							
							$.ui.getFitted.defaults.sizes = data.sizes;
						},
						
						handleUpdatedSlider: function(e, data) {
							var that = e.data;
							var parentID = data.elm.ui.parent.self.attr('id'),
									opts = $.ui.getFitted.defaults, otherElm;
							var childID = data.elm.ui.parent.self.attr('child'),
									opts = $.ui.getFitted.defaults, otherElm;
							
							function checkForCollision() {
								if(opts.collision && opts.collision.smaller && (opts.collision.smaller[0] === parentID || opts.collision.smaller[1] === parentID)) {
									if(opts.collision.smaller[0] === parentID) {
										otherElm = $('#'+opts.collision.smaller[1]).find('div.drag-inner').data('fittedSlider');
										if(data.elm.curVal > otherElm.curVal) {
											otherElm.element.triggerHandler('sliderChange', {val: (data.elm.curVal-otherElm.curVal)*5});
										}
									}
									else {
										otherElm = $('#'+opts.collision.smaller[0]).find('div.drag-inner').data('fittedSlider');
										if(data.elm.curVal < otherElm.curVal) {
											otherElm.element.triggerHandler('sliderChange', {val: (data.elm.curVal-otherElm.curVal)*5});
										}
									}
								}
							}
							
							
							function checkSizes() {
								
								var sizes,
										firstVal, 
										secondVal,
										errorElm = $('.result .warning');
								
								// Women - Oberbekleidung
								if($.ui.getFitted.defaults.categories[parentID] === 'tops') {
									that.errors[0] = false;
									sizes = $.ui.getFitted.defaults.sizes.tops;
									firstVal = parseInt(that.slider[0].curVal, 10);
									secondVal = parseInt(that.slider[1].curVal, 10);
									for(var i = 0, len = sizes.length; i<len;i++) {
										if(secondVal >= sizes[i].bust.min && secondVal <= sizes[i].bust.max) {
											for(var j = 0, jlen = sizes[i].cup.length; j<jlen; j++) {
												if(firstVal >= sizes[i].cup[j].min && firstVal <= sizes[i].cup[j].max) {
														that.braSize.html(sizes[i].name+' '+sizes[i].cup[j].type);
														that.errors[0] = true;
														break;
												} else {
													that.braSize.html('');
												}
											}
											if(that.errors[0]) { break; }
										} else {
											that.braSize.html('');
										}
									}
								}

								// Women - Unterwäsche
								if($.ui.getFitted.defaults.categories[parentID] === 'underwear') {
									that.errors[1] = false;
									sizes = $.ui.getFitted.defaults.sizes.underwear;
									firstVal = parseInt(that.slider[3].curVal, 10);
									//secondVal = parseInt(that.slider[3].curVal, 10);
									for(var k = 0, klen = sizes.length; k < klen; k++) {
										if(firstVal >= sizes[k].hip.min && firstVal <= sizes[k].hip.max ) {
											that.slipSize.html(sizes[k].name);
												that.errors[1] = true;
												break;
										} else {
											that.kidSize.html('');
										}
									}
								}
								
								// Kids - Kindergröße
								if($.ui.getFitted.defaults.categories[parentID] === 'kids') {
									that.errors[2] = false;
									sizes = $.ui.getFitted.defaults.sizes.kids;
									firstVal = parseInt(that.slider[4].curVal, 10);
									//secondVal = parseInt(that.slider[3].curVal, 10);
									for(var k = 0, klen = sizes.length; k < klen; k++) {
										if(firstVal >= sizes[k].bodyheight.min && firstVal <= sizes[k].bodyheight.max ) {
											that.kidSize.html(sizes[k].name);
												that.errors[1] = true;
												break;
										} else {
											that.kidSize.html('');
										}
									}
								}
								
								// Men Oberteile - Brustumfang und Taillenumfang
								if($.ui.getFitted.defaults.categories[parentID] === 'men' ||
										$.ui.getFitted.defaults.categories[childID] === 'men') {
									that.errors[3] = false;
									sizes = $.ui.getFitted.defaults.sizes.men;
									
									firstVal = parseInt(that.slider[0].curVal, 10);
									secondVal = parseInt(that.slider[2].curVal, 10);
									//thirdVal = parseInt(that.slider[3].curVal, 10);
									
									for(var k = 0, klen = sizes.length; k < klen; k++) {
										if(secondVal > firstVal) {
											if(secondVal >= sizes[k].waist.min && secondVal <= sizes[k].waist.max) {
													
												that.menSize.html(sizes[k].name);
												that.errors[1] = true;
												break;
											} else {
												that.menSize.html('');
											}
										} else {
											if(firstVal >= sizes[k].bust.min && firstVal <= sizes[k].bust.max) {
													
												that.menSize.html(sizes[k].name);
												that.errors[1] = true;
												break;
											} else {
												that.menSize.html('');
											}
										}
									}
								}

								// Men Wäschegröße - Hüftumfang
								if($.ui.getFitted.defaults.categories[childID] === 'men') {
									that.errors[3] = false;
									sizes = $.ui.getFitted.defaults.sizes.men;
									firstVal = parseInt(that.slider[3].curVal, 10);
									
									for(var k = 0, klen = sizes.length; k < klen; k++) {
										if(firstVal >= sizes[k].hip.min && firstVal <= sizes[k].hip.max) {
											that.menSize2.html(sizes[k].name2);
											that.errors[1] = true;
											break;
										} else {
											that.menSize2.html('');
										}
									}
								}
								
								/*if(!(that.errors[0] && that.errors[1])) {
									errorElm.find('h3:first').html($.ui.getFitted.defaults.errorHandler.header);
									errorElm.find('p:first').html($.ui.getFitted.defaults.errorHandler.text);
									errorElm.css({display: 'block'})
									
									if(!that.errors[0]) {
										that.braSize.html('');
									} else {
										that.slipSize.html('');
									}
								} else {
									errorElm.css({display: ''});
								} */
							}
							
							checkForCollision();
							// start processing of data after all ajax requests have completed
							$('body').ajaxSuccess( function() {
								if( complete === 0 && fired === false ) {
									checkSizes();
									fired = true;
								}
							});
							if( fired === true ) {
								checkSizes();
							}
						}
					}
			)
	);

	$.ui.fittedSlider.defaults = $.extend({}, $.ui.mouse.defaults, {});
	$.ui.getFitted.defaults = $.extend({}, $.ui.mouse.defaults, schiesser_data);

})(jQuery);

// init sizefinder
(function($){
	 
	function mapUrlParamToData( param ) {
		switch( param ) {
			case 'uk/en':
				schiesser_data.unit = 'cm';
				schiesser_data.country = 'gb';
				break;
			case 'de/de':	
				schiesser_data.unit = 'cm';
				schiesser_data.country = 'de';
				break;
			default:
				schiesser_data.unit = 'cm';
				schiesser_data.country = 'de';
				break;
		}
	}
	
    function callOnReady(){
    	// get country and unit from url if available
		var langInUrl = window.location.pathname.match(/\/[a-zA-Z]{2}\/[a-zA-Z]{2}\//);
		langInUrl = ( langInUrl != null ) ? langInUrl.toString().match(/[a-zA-Z]{2}\/[a-zA-Z]{2}/) : null;
		langInUrl = ( langInUrl != null ) ? langInUrl.toString() : '';
		var country_lang = ( jQuery.url.param("dest") ) ? jQuery.url.param("dest") : langInUrl;
		mapUrlParamToData( country_lang );
		
		// set error messages, loaded from html
		schiesser_data.errorHandler.header = $('.warning h3').text();
		schiesser_data.errorHandler.text = $('.warning p').text();
				
      $('#main').getFitted();
    }
    $(callOnReady);
})(jQuery);

