﻿/*
* Contains standard Tradelink javascript
*/

/*
----------------------
* "Global" variables 
*/
var cityControl;


/*** JLM / SHOW/HIDE HELP TEXTS ***/
$j(document).ready(function() {
	$j(".HelpLink").hover(
      function () {
		$j(this).siblings(".HelpText").fadeIn("fast");
      }, 
      function () {
        $j(this).siblings(".HelpText").fadeOut("fast");
      }
    );
});


/* AUTOTAB */
$j.fn.autotab=function(){$j(this).keyup(function(e){switch(e.keyCode){case 9:return false;case 16:return false;case 20:return false;default:var maxlength=$j(this).attr('maxlength');var inputlength=$j(this).val().length;if(inputlength>=maxlength){$j(this).siblings('input[type="text"]').focus();}}});}



/* Client side functionality for the CombinedValidator serverside control */
function CombinedValidatorIsValid(val)
{    
    var value = ValidatorGetValue(val.controltovalidate); 
    if ( val.required == 'True' || val.required == 'true' ) 
    {
        if (ValidatorTrim(value).length == 0) 
            return false;     
    }
    // Custom validation end, allow standard ASP .NET clientscript to do the rest
    if ( val.validationexpression ) 
        return RegularExpressionValidatorEvaluateIsValid(val);
    else
        return true;
}

/* Client side functionality for the CheckBoxValidator serverside control */
function CheckBoxValidatorEvaluateIsValid(arg)
{
    var value = document.getElementById(arg.controltovalidate);
    if ( value ) 
        return value.checked;
    else
        return false;
}

/* Client side functionality for validating a radio button list */
function RadioButtonListValidatorEvaluateIsValid(arg)
{
    var value = $j(arg.controltovalidate);
    var count = 0;
    for (i = 0; i < value.all.length; i++)
    {
        if (value.all[i].checked)
            return true;
    }
    return false;
}

/* Client side functionality for the RequiredOrValidator serverside control */
function RequiredOrValidatorIsValid(arg)
{
    var val1 = ValidatorGetValue(arg.controltovalidate);
    var val2 = ValidatorGetValue(arg.secondcontrol);
    if ( ValidatorTrim(val1).length + ValidatorTrim(val2).length > 0 ) 
        return true;
        
    return false;    
}

/* Clietn side functionality for the CreditCardValidator serverside control */
function CreditCardValidatorEvaluateIsValid(arg)
{
    var cardNumber = ValidatorGetValue(arg.controltovalidate);
    var min = arg.minwidth;
    var max = arg.maxwidth;
    var len = cardNumber.length 
    if ( len < min || len > max ) 
        return false;
    
    var modv = (len - 1) % 2;
    var sum = 0;
    var digit = 0;
    var i = 0;
    for( i = cardNumber.length - 1 ; i >= 0 ; i-- )
    {        
        digit = cardNumber.charAt(i) * 1;
        if ( i % 2 != modv )
            digit = digit * 2;
        sum += digit % 10;
        if ( digit >= 10 ) 
            sum += 1;
    }        
    return sum % 10 == 0 && sum > 0;
}

/* Client side functionality for the ExpiryDateValidator serverside control */  
function ExpiryDateValidatorEvaluateIsValid(arg)
{
    var year = ValidatorGetValue(arg.controltovalidate);    // control value must be full, 4-digit year
    var month = ValidatorGetValue(arg.monthcontrol);        // month index, 1 = January, etc.
    var date = new Date();
    var yearNow = date.getFullYear();
    var monthNow = date.getMonth() + 1;
    return year > yearNow || ( year >= yearNow && month >= monthNow )
}

/* Makes a hidden element visible */
/* elementId : The ID of the hidden element to make visible */
function makeVisible(elementId)
{
    var el = $j(elementId);
    if ( el ) 
    {
        el.style.visibility = "visible";
    }      
}

/* Asynchronous method for getting a city name from its zip code 
** zipCodeId : ID of the control containing the zip code
** targetID  : ID of the control that shall receive the city name.
* ----------------------------------------------------------------- */ 
function GetCityBegin(zipCodeId, targetId)
{
    var zipCode = $j(zipCodeId);
    var target = $j(targetId);
    if ( target && zipCode ) 
    {
        cityControl = target;      
        GetCityEnd(getPostalCode(zipCode.attr('value')));
    }        
}

/* GetCity callback */
function GetCityEnd(result)
{
    if ( cityControl )
    {    
        if ( result && result.length > 0 ) 
        {
            cityControl.attr('value',result); 
        }
    }    
}

/* Silently handle an AJAX timeout */
function ajaxTimeoutSilent(result) {}

/* --------- Search ----------- */ 
function searchRedirect(queryControl)
{
    if ( queryControl ) 
    {
        var query = queryControl.value;
        var cCategoryDropDown = $j(cCategoryDropDownId);
        if ( query && cCategoryDropDown ) 
        {    
            searchUrl = searchUrl + "&category=" + cCategoryDropDown.value;
            searchUrl = searchUrl + "&extra=" + escape(query);            
            window.location.href = searchUrl;
        }
    }
    return false;
}

function searchKeyPress(obj,ev)
{
    var keyCode = ev.which ? ev.which : ev.keyCode;
    if ( keyCode == 13 ) 
    {   
        ev.returnValue = false;
        ev.cancel  = true;     
        searchRedirect(obj);
    }
    return false;
}

/**************************************************************
/* General function for setting the CSS class on an
/* element, when a checkbox is checked or not.
/* -------------------------------------------------------
/* elementId : ID of the element on which to set a class.
/* checkBoxId : ID of the checkbox
/* classChecked : Class to set on the element if the checkbox is checked
/* classUnchecked : Class to set on the element if the checkbox is unchecked
/***************************************************************/
function setElementClassOnChecked(elementId,checkBoxId,classChecked,classUnchecked)
{
    var el = $j(elementId);
    var checkbox = $j(checkBoxId);
    if ( el && checkbox ) 
    {
        var css = checkbox.attr('checked') ? classChecked : classUnchecked;
        el.attr('class',css);
    }
}


Sys_Readonly_DefaultReadonlyBackgroundColor = "#E2E0D9 url('/Frontend/Graphics/Tradelink/bg_disabled.gif') repeat"; // Can be #hex or Css colornames
Sys_Readonly_DefaultReadWriteBackgroundColor = "#ffffff"; // Can be #hex or Css colornames

/* Sætter et elements readonly attribut

    elm = elementet, ex elm = document.getElementById("postnummer");, Må ikke være tom.
    isReadOnly = om den skal være readonly eller ej, kan være tom men skifter så bare værdi.
    bgColor = Baggrundsfarve, kan være tom, men tager så bare default værdi.
    
*/    
function setReadonly(elm, isReadOnly, bgcolor)
{
    //Sætter isReadOnly hvis det ikke i forvejen er en bool
    if(isReadOnly.toLower != "false" || isReadOnly.toLower != "true")
    {
        
        isReadOnly = elm.disabled ? false : true;   
    }

    //Sætter baggrundsfarve fra sys værdier, hvis den er tom.
    if(bgcolor == "" && isReadOnly)
    {
       bgcolor = Sys_Readonly_DefaultReadonlyBackgroundColor;       
    }
    else if(bgcolor == "" && !isReadOnly)
    {
        bgcolor = Sys_Readonly_DefaultReadWriteBackgroundColor;
    }
    
    //Sætter elementer
    elm.disabled = isReadOnly;
    /*
    // Gøres browserkompatibel. Fejl konstateret i FF.
    elm.style.background = bgcolor;
    */
}

/* Tager et array af elementer */
/* DEPRECATED */
function setReadonlyArr(elms, isReadOnly, bgColor)
{
    for (var j = 0; j < elms.length; j++) 
    {
       setReadonly(elms[j], isReadOnly, bgColor);          
    } 
}


$j(document).ready(function(){

    //Tradelink - Dropdown menu
    $j('.ProductMenu ul li.menuItem').each(function(){                 
        if($j(this).attr('class').split(' ')[1] == 'selected'){
            $j(this).find('ul').show();
        }     
    });
    
    //Tradelink - Itemadded  
    $j('.SmallBasket table .BasketClearButton').each(function() {
        $j(this).click(function(){
            $j('.SmallBasket').find('.messageInformation').css({'background' : 'url(/frontend/graphics/backgrounds/bgItemAdded.gif) no-repeat'})
        });
    });
       
    //-------------------- Tradelink - ItemDetails -------------------------       
    // JR / Dropshadow on item label (price label on top of image), Wagner
    $j('.wagner #ItemLabel').dropShadow();
    
    
    // JR / Item details slider
//    var DetailList = $j('#ItemDetails .Detail h2');
//    
//    DetailList.click(function() {
//        //Variables
//        var Title = $j(this);
//        
//            $j('.last-active').slideUp(300, function(){
//                $j(this).siblings('h2').css({'background-image' : 'url(/frontend/graphics/backgrounds/white_arrow.png)'});
//                
//                //Fjerner klasserne "last-acitve" & "clicked", så tabs kan foldes ud igen.
//                $j(this).siblings('h2').removeClass('clicked');
//                $j(this).removeClass('last-active');
//            });
//            
//            //Laver et check på om tab er sizeguide dvs. ikke af klassen "out"
//            if(Title.hasClass('Out')){
//                //Laver et check på om tab er blevet foldet ud en gang før.
//                if(Title.hasClass('clicked') == false){
//                    Title.siblings('.Container').slideDown(300, function(){
//                        Title.css({'background-image' : 'url(/frontend/graphics/backgrounds/white_arrowdown.png)'});
//                        $j(this).addClass('last-active');
//                        
//                        //console.log("test", Title.text());
//                        pageTracker._trackPageview("/Varevisning_"+Title.text());
//                        
//                        
//                    });
//                }
//            } else {
//                Title.css({'background-image' : 'url(/frontend/graphics/backgrounds/white_arrowdown.png)'});        
//            }
//            
//            //Sætter klassen clicked, så tab kun kan foldes ud en gang.
//            Title.addClass('clicked'); 
//    });    

    
   
    //-------------------- Tradelink - ItemDetails - COLOR VARIANT -------------------------
          
    // JR / Show/hide variant feature displays
      
    var featureDisplayHover = {    
     // number = sensitivity threshold (must be 1 or higher) 
     sensitivity: 3,   
     // number = milliseconds for onMouseOver polling interval 
     interval: 0.5, 
     // function = onMouseOver callback (REQUIRED)
     over: function(){$j("ul",this).fadeIn("fast"); $j(this).siblings().find('ul').hide(); },     
     // number = milliseconds delay before onMouseOut
     timeout: 250,     
     // function = onMouseOut callback (REQUIRED)
     out: function(){$j("ul",this).fadeOut("fast")}     
    };
    
    $j('div.ColorVariant, div.SizeVariant').hoverIntent(featureDisplayHover);
    
    $j('div.ColorVariant, div.SizeVariant').click(function() {
        $j('ul', this).fadeIn("fast");
    });
      
    // JR / Show/hide SmallBasket feature displays
    
    $j('.ShopCatalog div.SmallBasket, .ShopFront div.SmallBasket').hoverIntent({    
     // number = sensitivity threshold (must be 1 or higher) 
     sensitivity: 3,    
     // number = milliseconds for onMouseOver polling interval 
     interval: 50,    
     // function = onMouseOver callback (REQUIRED)
     over: function(){$j(this).find('.Container').fadeIn("fast");},
     // number = milliseconds delay before onMouseOut
     timeout: 200,     
     // function = onMouseOut callback (REQUIRED)
     out: function(){$j(this).find('.Container').fadeOut("medium");}     
    });      
    

    // JR / Change Large image    
//    $j('.ColorVariant ul li a img').hover(function() {
//        $j('#ItemImageContent').attr('src', $j(this).parent('a').attr('rel'));
//    }, function(){
//        $j('#ItemImageContent').attr('src', $j('#ItemImageNav a:first').attr('href')); 
//    });
    
    
    // LM updated / Change large image from color variant display
    $j('.ColorVariant ul li a img').hoverIntent({    
     // number = sensitivity threshold (must be 1 or higher) 
     sensitivity: 3,    
     // number = milliseconds for onMouseOver polling interval 
     interval: 200,    
     // function = onMouseOver callback (REQUIRED)
     over: function(){$j('#ItemImageContent').attr('src', $j(this).parent('a').attr('rel'));},
     // number = milliseconds delay before onMouseOut
     timeout: 200,     
     // function = onMouseOut callback (REQUIRED)
     out: function(){$j('#ItemImageContent').attr('src', $j('#ItemImageNav a:first').attr('display'));}     
    });      
    
    
    
    // JR / Update text and hide list
    $j('.ColorVariant ul li a img').click(function() {
        //$j('.ColorVariant .ItemCustomDropdown span').text($j('.ColorVariant ul li a').text());
        //$j('.ColorVariant ul').fadeOut('fast');
        $j('.ColorVariant ul').html('<li class="Loading"></li>');
    });
    
    $j('.SizeVariant ul li a').click(function() {
        //$j('.SizeVariant .ItemCustomDropdown span').text($j(this).text());
        //$j('.SizeVariant ul').fadeOut('fast');
        $j('.SizeVariant ul').html('<li class="Loading"></li>');
    });    
    
    //Max amount check
    $j('input.CountControl').blur(function() {
		var currentNum = parseInt($j('input.CountControl').val());
		var maxNum = parseInt($j('.ItemsAvailable span').text());
   		if (currentNum + 1 > maxNum) {
	   		$j('.CountControl').attr('value', maxNum);
   		}   		
    });    
    
    //Add/Subtract
    $j('.AddSubButtonBgWrapper div.AddButton').click(function() {
		var currentNum = parseInt($j('input.CountControl').val());
		var maxNum = parseInt($j('.ItemsAvailable span').text());
   		if (currentNum + 1 <= maxNum) {
	   		$j('.CountControl').attr('value',currentNum + 1);	
   		}
    });
    $j('.AddSubButtonBgWrapper div.SubButton').click(function() {
		var currentNum = parseInt($j('input.CountControl').val());
        if (!/[^\d]/.test(parseInt(currentNum-1))) $j('.CountControl').attr('value',currentNum - 1)
    });    
    
});

/* AJAX Basket stuff */

// Gets the base ajax url
function getAjaxUrl() {
    var path = "?sc_device=ajax";
    /*var path = window.location.protocol + "//" + window.location.host + window.location.pathname;
    path = path.replace(".aspx", "");
    path += "/ajaxaccess.aspx";*/
    return path;
}

// Adds an item to the basket. itemelement is a jQuery selector caining the item elements.
function basketAddFromElement(itemelement, trigger) {
    var countcontrol = itemelement.find(".CountControl")[0];
    var variantDropDown = itemelement.find(".VariantDropDown")[0];
    var count;
    
    if (countcontrol) count = countcontrol.value;
    
    // if count is not a number, set to 1   
    if (/[^0-9]/.test(count)) {
		count=1;
    }
    
    if (itemelement.length){
            var itemId = itemelement[0].id;
        if (variantDropDown) {
            itemId = variantDropDown.value;
        }
        basketAdd(itemId, count, trigger);
    }
    
    //Google Tracking
    //pageTracker._trackPageview("/vare_i_indkoebskurv");
}

/* Adds the item with the specified id to the basket. */
function basketAdd(itemId, count, trigger) {
    var url = getAjaxUrl();
    if (itemId && count) {
        url += "&action=add&c=basketboxajax";   // Possible actions: Remove, Clear, Add.
        url += "&itemid=" + itemId;
        url += "&count=" + count;

        //update small basket
        //$j.get(url, null, replaceBasket);
        
        $j.ajax({
		  url: url,
		  success: function(data, textStatus) {
			var element = $j("#smallBasketContent");
			if (element) {
				element.html(data);

				if(trigger.length){
					// update trigger
					trigger.siblings(".BasketAction").remove(); // get rid of any existing messages
					$j("#ItemOptions .ItemAction .ToBasket").show(); 
					
									
					$j(".BasketAction","#SmallBasket").clone().insertAfter(trigger).fadeIn(200).fadeTo(200, 1).fadeTo(200,0).fadeTo(200, 1).fadeTo(200,0).fadeTo(200,1).fadeTo(2500, 1).fadeOut(2000); // Blink and stuff
						
				}
				
				
				// LM / Animate product image to basket / Proof of concept

				$j("#Item").css('position','relative')
				.find("#ItemImageContent").clone()
				.prependTo($j("#Item"))
				.css('position','absolute')
				.animate({
					opacity: 0.25,
					right: '-20px',
					top: '50px',
					height: 'toggle',
					width: 'toggle'
				  }, 800, function() {// Animation complete.
					$j(this).remove();
				});
					  
				pageTracker._trackPageview("/tilfoejet_indkoebskurv");
			}
		  }
		});
        
        //update simple basket
        //$j.get(getAjaxUrl() + "&c=basketboxsimpleajax", null, replaceSimpleBasket)        
    }
}

/* Remove the item with the specified ID from basket. */
function basketRemove(itemId) {
    var url = getAjaxUrl();
    if (itemId) {
        url += "&action=remove&c=basketboxajax";
        url += "&itemid=" + itemId;

        //update small basket
        $j.get(url, null, replaceBasket);
        //update simple basket
        //$j.get(getAjaxUrl() + "&c=basketboxsimpleajax", null, replaceSimpleBasket)
    }
}
/* Clears the basket. */
function basketClear() {
    var url = getAjaxUrl();
    url += "&action=clear&c=basketboxajax";

    //update small basket
    $j.get(url, null, replaceBasket);
    //update simple basket
    $j.get(getAjaxUrl() + "&c=basketboxsimpleajax", null, replaceSimpleBasket)
}


/* Replaces small basket content. Used as callback for the basket ajax operations */
function replaceBasket(data, textStatus) {
    var element = $j("#smallBasketContent");
    if (element) {
        element.html(data);
    }
}

/* Replaces simple basket content. Used as callback for the basket ajax operations */
function replaceSimpleBasket(data, textStatus) {
    var element = $j("#SimpleBasketAmount");
    if (element) {
        element.html($j.trim(data));
    }
}