/*
 * BULERS specific site extensions.
 *
 * The code relies on the jQuery JS library
 */
var hero;
jQuery(document).ready(function(){
		jQuery(".hintedInputField").click(function(){jQuery(this).val("");});
		if(jQuery(".hero").size() > 0) {
			initHero();
		}
});

(function( $ ){
	/**
	 * creates shadows around a selection (only one div)
	 */
	  $.fn.butlersShadow = function(directions) {
		
		return this.each(function() {  
		
			var width = jQuery(this).width();
			var height = jQuery(this).height();
			var left = jQuery(this).offset().left;
			var top = jQuery(this).offset().top;
			var sw = 10;
			var rect;
			
			var classShadow = jQuery(this).attr("id") + "_shadow";
			jQuery(this).data("butlersShadow", classShadow);
	
			if(!(jQuery.inArray(1, directions) > -1)) {
				rect = jQuery('<div class="shadowContainer corner topLeft" />').addClass(classShadow).appendTo("body");
				setBounds(rect, [sw, sw, (top - sw), (left-sw)]);
			}
	
			if(!(jQuery.inArray(1, directions) > -1)) {
				rect = jQuery('<div class="shadowContainer top" />').addClass(classShadow).appendTo("body");
				setBounds(rect, [width, sw, (top-sw), left]);
			}	
	
			if(!(jQuery.inArray(1, directions) > -1)) {
				rect = jQuery('<div class="shadowContainer corner topRight" />').addClass(classShadow).appendTo("body");
				setBounds(rect, [sw, sw, (top - sw), (left + width)]);
			}
			
			rect = jQuery('<div class="shadowContainer left" />').addClass(classShadow).appendTo("body");
			setBounds(rect, [sw, height, top, (left-sw)]);
	
			rect = jQuery('<div class="shadowContainer right" />').addClass(classShadow).appendTo("body");
			setBounds(rect, [sw, height, top, (width + left)]);
	
			rect = jQuery('<div class="shadowContainer corner bottomLeft" />').addClass(classShadow).appendTo("body");
			setBounds(rect, [sw, sw, (height + top), (left-sw)]);
	
			rect = jQuery('<div class="shadowContainer bottom" />').addClass(classShadow).appendTo("body");
			setBounds(rect, [width, sw, (top + height), left]);
			
			rect = jQuery('<div class="shadowContainer corner bottomRight" />').addClass(classShadow).appendTo("body");
			setBounds(rect, [sw, sw, (top + height), (left + width)]);
		});
	  };
	  
	  $.fn.butlersRemoveShadow = function() {
		  return this.each(function() {  
			  var classShadow = jQuery(this).attr("id") + "_shadow";
			  jQuery("." + classShadow).remove();
		  });
	  };
	  
	  $.fn.highlight = function(pat) {
			function innerHighlight(node, pat) {
				var skip = 0;
				if (node.nodeType == 3) {
					var pos = node.data.toUpperCase().indexOf(pat);
					if (pos >= 0) {
						var spannode = document.createElement('span');
						spannode.className = 'highlight';
						var middlebit = node.splitText(pos);
						var endbit = middlebit.splitText(pat.length);
						var middleclone = middlebit.cloneNode(true);
						spannode.appendChild(middleclone);
						middlebit.parentNode.replaceChild(spannode, middlebit);
						skip = 1;
					}
				}
				else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {
					for (var i = 0; i < node.childNodes.length; ++i) {
						i += innerHighlight(node.childNodes[i], pat);
					}
				}
				return skip;
			}
			return this.each(function() {
				innerHighlight(this, pat.toUpperCase());
			});
		};
		

		$.fn.focusNextInputField = function() {
		    return this.each(function() {
		    	console.log("focusNextInputField:");
		        var fields = $(this).parents('form:eq(0),body').find("input:visible,textarea:visible,select:visible");
		        var index = fields.index( this );
		        console.log("focusNextInputField idx:" + index);
		        if ( index > -1 && ( index + 1 ) < fields.length ) {
		            fields.eq( index + 1 ).focus();
		        }
		        return false;
		    });
		};
})( jQuery );

(function($) {
	$.fn.reverseOrder = function() {
		return this.each(function() {
			$(this).prependTo( $(this).parent() );
		});
	};
})(jQuery);


/* width, height left, top */
function setBounds(selector, bounds) {
	jQuery(selector).css("width",  	bounds[0] + "px");
	jQuery(selector).css("height", 	bounds[1] + "px");
	jQuery(selector).css("top", 	bounds[2] + "px");
	jQuery(selector).css("left", 	bounds[3] + "px");
}

/* BASKET --------------------------------------------------*/
function butlersAddMini(pid, quantity, avMsgContainer) {
	if(checkAvailability(pid, quantity, avMsgContainer)) {
		app.minicart.add('', {'pid' : pid, 'Quantity' : quantity});
	}
}

function checkAvailability (pid, quantity, avMsgContainer) {
	var avData;
	var a2b = false;
	app.ajax.getJson({
		url		: app.URLs.getAvailability,
		data	: {"pid": pid, "Quantity": quantity, "format": "json"},
		async	: false,
		callback: function(data){
			if (!data || !data.avLevels) {
				jQuery(avMsgContainer).html("Zurzeit leider nicht verfügbar");
			}
			else {
				avData = data;
			}
		}
	});
	if(avData.avLevels["IN_STOCK"] == 0 ) {
		jQuery(avMsgContainer).html("Zurzeit leider nicht verfügbar");
	}
	else if(avData.avLevels["IN_STOCK"] < quantity ) {
		jQuery(avMsgContainer).html("Es sind nur " + avData.avLevels["IN_STOCK"] + " Produkte verfügbar.");
		quantity = avData.avLevels["IN_STOCK"];
		a2b = false;
	}
	else {		
		a2b = true;
		jQuery(avMsgContainer).html("");
	}
	
	if(a2b) {
		var baa = getBasketAwareAvailability(pid, quantity);
		if (baa < quantity) {
			jQuery(avMsgContainer).html("Zurzeit leider nicht verfügbar");
			a2b = false;
		}
	}
	
	return a2b;
}

function getBasketAwareAvailability(pid, quantity) {
	var retval = 0;
	app.ajax.getJson({
		url		: app.URLs.getBasketAvailability,
		data	: {"pid": pid, "Quantity": quantity},
		async	: false,
		callback: function(data){
			retval = data.ATS;
		}
	});		
	return retval;
}

function printStackTrace() {
  var callstack = [];
  var isCallstackPopulated = false;
  try {
    i.dont.exist+=0; //doesn't exist- that's the point
  } catch(e) {
    if (e.stack) { //Firefox
      var lines = e.stack.split('\n');
      for (var i=0, len=lines.length; i<len; i++) {
        if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
          callstack.push(lines[i]);
        }
      }
      //Remove call to printStackTrace()
      callstack.shift();
      isCallstackPopulated = true;
    }
    else if (window.opera && e.message) { //Opera
      var lines = e.message.split('\n');
      for (var i=0, len=lines.length; i<len; i++) {
        if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
          var entry = lines[i];
          //Append next line also since it has the file info
          if (lines[i+1]) {
            entry += ' at ' + lines[i+1];
            i++;
          }
          callstack.push(entry);
        }
      }
      //Remove call to printStackTrace()
      callstack.shift();
      isCallstackPopulated = true;
    }
  }
  if (!isCallstackPopulated) { //IE and Safari
    var currentFunction = arguments.callee.caller;
    while (currentFunction) {
      var fn = currentFunction.toString();
      var fname = fn.substring(fn.indexOf('function') + 8, fn.indexOf('')) || 'anonymous';
      callstack.push(fname);
      currentFunction = currentFunction.caller;
    }
  }
  output(callstack);
}
 
function output(arr) {
  //Optput however you want
  alert(arr.join('\n\n'));
}
	
function formatJSON(oData, sIndent) {
    if (arguments.length < 2) {
        var sIndent = "";
    }
    var sIndentStyle = "    ";
    var sDataType = RealTypeOf(oData);

    // open object
    if (sDataType == "array") {
        if (oData.length == 0) {
            return "[]";
        }
        var sHTML = "[";
    } else {
        var iCount = 0;
        $.each(oData, function() {
            iCount++;
            return;
        });
        if (iCount == 0) { // object is empty
            return "{}";
        }
        var sHTML = "{";
    }

    // loop through items
    var iCount = 0;
    $.each(oData, function(sKey, vValue) {
        if (iCount > 0) {
            sHTML += ",";
        }
        if (sDataType == "array") {
            sHTML += ("\n" + sIndent + sIndentStyle);
        } else {
            sHTML += ("\n" + sIndent + sIndentStyle + "\"" + sKey + "\"" + ": ");
        }

        // display relevant data type
        switch (RealTypeOf(vValue)) {
            case "array":
            case "object":
                sHTML += formatJSON(vValue, (sIndent + sIndentStyle));
                break;
            case "boolean":
            case "number":
                sHTML += vValue.toString();
                break;
            case "null":
                sHTML += "null";
                break;
            case "string":
                sHTML += ("\"" + vValue + "\"");
                break;
            default:
                sHTML += ("TYPEOF: " + typeof(vValue));
        }

        // loop
        iCount++;
    });

    // close object
    if (sDataType == "array") {
        sHTML += ("\n" + sIndent + "]");
    } else {
        sHTML += ("\n" + sIndent + "}");
    }

    // return
    return sHTML;
}

function RealTypeOf(v) {
  if (typeof(v) == "object") {
    if (v === null) return "null";
    if (v.constructor == (new Array).constructor) return "array";
    if (v.constructor == (new Date).constructor) return "date";
    if (v.constructor == (new RegExp).constructor) return "regex";
    return "object";
  }
  return typeof(v);
}

String.prototype.startsWith = function(str)
{return (this.match("^"+str)==str)};


var heroTimeoutValue = 7000;
var heroCurrentPage = 0;
var heroTimer;
var heroState = "play";

function initHero() {
	jQuery("<div class='banner'><div class='control'/><div class='paginator'/></div>").appendTo(".hero");
	jQuery("<div class='ctrl prev'>&lt;</div>").click(heroPrev).appendTo(".banner .paginator");
	jQuery(".hero a").each(function(index,elem){ 
			jQuery(elem).data("heropageelement", index);
			jQuery("<div id='heropaginator"+index+"' class='nr'><div>"+(index+1)+"</div></div>").click(function(){heroJumpTo(index);}).appendTo(".banner .paginator"); 
		});
	jQuery("<div class='ctrl next'>&gt;</div>").click(heroNext).appendTo(".banner .paginator");
	
	var hoverConfig =  {"over": 	function() { 
										if(jQuery(this).hasClass("pp")) {
											jQuery("span.hintfs").hide();
											jQuery("span.hintpp").show();
										}
										if(jQuery(this).hasClass("fs")) {
											jQuery("span.hintpp").hide();
											jQuery("span.hintfs").show();
										}
									},
						"timeout" : 500,
						"interval" : 100,
						"out" : 	function() {
										if(jQuery(this).hasClass("pp")) {
											jQuery("span.hintpp").hide();
										}
										if(jQuery(this).hasClass("fs")) {
											jQuery("span.hintfs").hide();
										} }
									};
	jQuery("<span class='pp pl'></span>").hoverIntent(hoverConfig).click(heroPlayPause).appendTo(".banner .control");
	jQuery("<span class='fs'></span>").hoverIntent(hoverConfig).click(heroFullScreen).appendTo(".banner .control");
	jQuery("<span class='hint hintpp'>Play</span>").appendTo(".banner .control");
	jQuery("<span class='hint hintfs'>Vollbild</span>").appendTo(".banner .control");
	
	jQuery(".hero a").reverseOrder();
	heroSetPage();
	heroTimer = setTimeout(fadeout, heroTimeoutValue);
	
}

function fadeout() {
	jQuery(".hero a:last").animate({"opacity" : 0}, 500,afterFade);
}

function heroPlayPause() {
	if(heroState == "play") {
		// pause playing
		heroStopPlaying();
	}
	else {
		// start playing
		heroSartPlaying() 
	}
	/*jQuery(".banner .control .pp").text(heroState);*/
}
function heroFullScreen() {
	heroStopPlaying();
	var imgSrc = jQuery(".hero a:last img").attr("src");
	var originalImgHeight = jQuery(".hero a:last img").height();
	var originalImgWeight = jQuery(".hero a:last img").width();
	
	var imgWidth = Math.ceil(jQuery(window).width() * 94/100);
	var imgHeight = Math.ceil(imgWidth / originalImgWeight * originalImgHeight);
	
	var style="width:" + imgWidth + "px; height:" + imgHeight + "px;";
	var box = "<div><img src='" + imgSrc + "' style='" + style + "'></img></div>";
	
	jQuery.fancybox(box,
			{
				"autoScale" 	: true,
				"autoDimensions": true,
				"padding"		: 2,
				"width"			: imgWidth,
				"height"		: imgHeight,
				"overlayOpacity" : 0.9,
				"overlayColor" : "#000"
			}).click();
	return false;
}

function heroSartPlaying() {
	heroState = "play";
	jQuery(".banner .control .pp").removeClass("pa").addClass("pl");
	/*jQuery(".banner .control .pp").text(heroState);*/
	heroTimer = setTimeout(fadeout, 0);
}

function heroStopPlaying() {
	heroState = "pause";
	jQuery(".banner .control .pp").removeClass("pl").addClass("pa");
	/*jQuery(".banner .control .pp").text(heroState);*/
	clearTimeout(heroTimer);
}

function heroPrev() {
	heroStopPlaying();
	var tmpdata = jQuery(".hero a:first").data("heropageelement");
	var firstImg = jQuery(".hero a:first").remove();
	firstImg.insertAfter(".hero a:last").css({"opacity" : 1}).data("heropageelement", tmpdata);
	heroSetPage();
}

function heroNext() {
	heroStopPlaying();
	var tmpdata = jQuery(".hero a:last").data("heropageelement");
	var firstImg = jQuery(".hero a:last").remove();
	firstImg.prependTo(".hero").css({"opacity" : 1}).data("heropageelement", tmpdata);
	heroSetPage();
}

function heroJumpTo(page) {
	heroStopPlaying();
	if(page==heroCurrentPage) {
		return;
	}
	if(page > heroCurrentPage) {
		// cycle n steps forward
		for(var i=heroCurrentPage; i<page; i++) {
			heroNext();
		}
	}
	if(page < heroCurrentPage) {
		// cycle n steps back
		for(var i=heroCurrentPage; i>page; i--) {
			heroPrev();
		}
	}
}

function heroSetPage() {
	heroCurrentPage = jQuery(".hero a:last").data("heropageelement");
	jQuery(".banner .paginator .nr").removeClass("selected");
	jQuery("#heropaginator"+heroCurrentPage).addClass("selected");
}

function afterFade() {
	var tmpdata = jQuery(".hero a:last").data("heropageelement");
	var firstImg = jQuery(".hero a:last").remove();
	firstImg.prependTo(".hero").css({"opacity" : 1}).data("heropageelement", tmpdata);

	heroSetPage();
	if(heroState == "play") {
		heroTimer = setTimeout(fadeout, heroTimeoutValue);		
	}
}

function selectAddress(addressID, formPrefix, formselector) {
	var adr = addresses[addressID];
	jQuery("input[name="+formPrefix+"_companyName]").val(avoidNull(adr.companyName));
	jQuery("input[name="+formPrefix+"_firstName]").val(avoidNull(adr.firstName));
	jQuery("input[name="+formPrefix+"_lastName]").val(avoidNull(adr.lastName));
	jQuery("input[name="+formPrefix+"_address1]").val(avoidNull(adr.address1));
	jQuery("input[name="+formPrefix+"_address2]").val(avoidNull(adr.address2));
	jQuery("input[name="+formPrefix+"_zip]").val(avoidNull(adr.postalCode));
	jQuery("input[name="+formPrefix+"_city]").val(avoidNull(adr.city));
	jQuery("select[name="+formPrefix+"_country]").val(adr.countryCode);
	
	// packstation enabled?
	if(jQuery(formselector + " .formfield.packstation").size()>0) {		
		var usePS = adr.address1.startsWith("Packstation");
		showPackStation(formselector, usePS);
	}
}

function avoidNull(str) {
	if(str == null) {
		return "";
	}
	return str;
}

function showPackStation(formselector, val) {
	
	if(val){
		jQuery(formselector + " .normalShipment").find("input,select").attr("disabled", true);
		jQuery(formselector + " .normalShipment").hide();
		jQuery(formselector + " .packStationShipment").find("input,select").attr("disabled", false);
		jQuery(formselector + " .packStationShipment").show();
		jQuery(formselector + " .packstation input").attr("checked", true);
		
		var adr1 = jQuery(formselector + " .formfield.address1 input").val();
		var psNumber = adr1.substring(adr1.lastIndexOf(" ")+1);
		jQuery(formselector + " .packstationNumber").val(psNumber);
	}
	else {
		jQuery(formselector + " input").removeClass("errorclient");
		jQuery(formselector + " .normalShipment").find("input,select").attr("disabled", false);
		jQuery(formselector + " .normalShipment").show();
		jQuery(formselector + " .packStationShipment").find("input,select").attr("disabled", true);
		jQuery(formselector + " .packStationShipment").hide();
		jQuery(formselector + " .packstation input").attr("checked", false);
	}
	/*adjustLabels*/
	jQuery(".formfield .label").each(function(idx, elem) {
		var labelHeight = jQuery(elem).height();
		if(labelHeight > 17) {
			var diff = labelHeight-20;
			jQuery(elem).parent().find(".value").css({
				"margin-top" : (diff + "px")
			});
		}
	});
	
	// blur listeners
	if(!(typeof buildBlurListeners === 'undefined')) {
		buildBlurListeners();
	}
}	
/*workaround for IE, see http://bugs.jquery.com/ticket/1954*/
function getButtonVal(button) {
	var buttonValue = "";
	if (jQuery.browser.msie) {
		var label = jQuery(button).text(); 
		jQuery(button).text("");
		buttonValue = jQuery(button).val();
		jQuery(button).text(label);
	}
	else {
		buttonValue = jQuery(button).val();
	}
	return buttonValue;
}

function setButtonVal(button, value) {
	var buttonValue = "";
	if (jQuery.browser.msie) {
		var label = jQuery(button).text(); 
		jQuery(button).text("");
		jQuery(button).attr("value", value);
		jQuery(button).text(label);
	}
	else {
		jQuery(button).val(value);
	}
}

function getStickvogelConfig(pid) {
	var cfg;
	jQuery.ajax({
		contentType	: "application/json; charset=utf-8",
		dataType	: "json",
		url			: app.URLs.svGetConfig,
		cache		: true,
		async		: false,
		data		: {"pid":pid},

		success: function(response, textStatus) {
			cfg = response;
		},

		error: function(request, textStatus, error) {
		}
	});
	return cfg;
}

function openConfigurator() {
	// initialize the fancybox
	jQuery("<div></div>").fancybox({
		"width" 			: 970,
        "height" 			: 560,
        "padding" 			: 0,
        "margin" 			: 0,
        "modal" 			: true,
    	"autoScale" 		: false,
        "autoDimensions"	: false,
        "type" 				: "iframe",
        "hideOnOverlayClick": false,
        "showCloseButton" 	: false,
        "enableEscapeButton": false, 
		"href" 				: app.stickvogel.getConfiguratorURL()
	}).trigger("click");
}

function onCloseConfigurator(data, pipeline, successFunction, suffix) {
	jQuery.fancybox.close();
	if(data.cancelled == "false") {
		var dataMap = { "pid"             : app.stickvogel.currentProductID, 
						"pli"			  : app.stickvogel.currentLineItemID,
						"stickvogelID"    : data.stickvogelID,
						"previewImageURL" : data.previewImageURL};
		
		jQuery.each(data.selectedOptions, function(idx,value){
			dataMap["dwopt_" + app.stickvogel.currentProductID + "_" + idx] = value + suffix;
		});
		jQuery.ajax(
			{
				type 	: "POST",
				url  	: pipeline,
				data 	: dataMap,
				async	: false,
				error	: function(jqXHR, textStatus, errorThrown) {/*alert(formatJSON(textStatus));*/},
				success	: successFunction
			}
		);
	}
	else {
		// just close
	}
}


/*
 * checks to fields together for a maximal length
 */
function checkFieldsCombination(field1, field2, max, hint) {
	jQuery(field1).bind("keyup", function(){checkMaxCombination(field1, field2, max, hint);});
	jQuery(field2).bind("keyup", function(){checkMaxCombination(field2, field1, max, hint);});
}

 /*
  * limits the current field to 'max' characters.
  * if maximum is reached, add the 'errorclient' css class to field1
  */
function checkMaxCombination(field1, field2, max, hint) {
	var l1 = jQuery(field1).val().length;
	var l2 = jQuery(field2).val().length;
	
	if ((0 + l1 + l2) > max) {
		var tv = jQuery(field1).val();
		if(tv.length>0) {
			jQuery(field1).addClass("errorclient");
			jQuery(field1).val(tv.slice(0, tv.length-1));
			if(jQuery(field1).siblings("span.errormessage").size()==0) {				
				jQuery("<span class='errormessage'></span>").text(hint).insertAfter(jQuery(field1));
			}
		}
	}
	else {
		jQuery(field1).siblings("span.errormessage").remove();
	}
} 
