//AJAX globalsettings
var BasketServiceURL = "Services/BasketService.svc/";
var BasketServiceProxy = new serviceProxy(BasketServiceURL);

// *** Generic Service Proxy class that can be used to 
// *** call JSON Services generically using jQuery
// *** Depends on JSON2 modified for MS Ajax usage
function serviceProxy(serviceURL) {
    var _I = this;
    this.ServiceURL = serviceURL;

    // *** Call a wrapped object
    this.invoke = function (options) {

        // Default settings
        var settings = {
            serviceMethod: '',
            data: null,
            callback: null,
			beforeSend: null,
            error: null,
            type: "POST",
            processData: false,
            contentType: "application/json",
            timeout: 120000, //Not Preferable, but needed for now.
            dataType: "text",
            bare: false
        };

        if (options) {
            $j.extend(settings, options);
        }

        // *** Convert input data into JSON - REQUIRES Json2.js
        var json = JSON2.stringify(settings.data);

        // *** The service endpoint URL ----------------------------------------------------------------------- TODO Change!
        var url = 'http://'+window.location.hostname+'/' + _I.ServiceURL + settings.serviceMethod;

        $j.ajax({
            url: url,
            data: json,
            type: settings.type,
			beforeSend: settings.beforeSend,
            processData: settings.processData,
            contentType: settings.contentType,
            timeout: settings.timeout,
            error: settings.error,
            dataType: settings.dataType,
            success:
                    function (res) {
                        if (!settings.callback) { return; }

                        // *** Use json library so we can fix up MS AJAX dates
                        var result = JSON2.parse(res);

                        if (result.ExceptionDetail) {
                            OnPageError(result.Message);
                            return;
                        }

                        // *** Bare message IS result
                        if (settings.bare)
                        { settings.callback(result); return; }

                        //http://encosia.com/2009/07/21/simplify-calling-asp-net-ajax-services-from-jquery/
                        if (result.hasOwnProperty('d'))
                        { return settings.callback(result.d); }
                        else
                        { return result; }


                        // *** Wrapped message contains top level object node
                        // *** strip it off
                        //                        for (var property in result) {
                        //                            settings.callback(result[property]);
                        //                            break;
                        //                        }
                    }
        });
    };
}



//A ProductInfo JSON obj used for AJAX
var ProductInfo = {
    ItemNumber: '',
    Count: ''
};


//^^^=========================================================== AJAX ============================================================^^^




/* shadowbox not currently used */
/* if needed, uncomment references in links.xslt and screen.scss */

//Shadowbox.init({
//    players: ["img", "wmp", "swf", "flv", "qt"]
//});

var browserIsIE6 = false;


/* LM / check for browser version - use only if absolutely necessary */
jQuery.each(jQuery.browser, function (i, val) {
    //	if(i=="mozilla" && jQuery.browser.version.substr(0,3)=="1.9"){
    //		alert("Do stuff for firefox 3") 
    //	} else 
    if (i == "msie" && jQuery.browser.version.substr(0, 1) == "6") {
        browserIsIE6 = true;
    }
});



$j(document).ready(function () {

	$j('.ShadowBox').each(function () {
		$j(this).attr('rel', 'shadowbox');
	});


	/* LM / EXPANDIBLE HORIZONTAL MAIN MENU */
	$mainMenu = $j("#mainMenu");
	if ($mainMenu.length > 0) ExpandibleMainMenu($mainMenu);

	$j("#langSelectionTrigger").click(function () {
		$j("#langOptions").toggle();
		return false;
	});

	$j(".close", "#langOptions").click(function () { 
	
		$j("#langOptions").hide();

	
	});

});







function ExpandibleMainMenu($mainMenu) {

    var $mainMenuPoint = $j("#mainMenu ul.level0 > li"),
	$mainMenuLevel1 = $j("ul.level1", $mainMenu),
	containerwidth = $j("#mainMenu").offsetParent().innerWidth(true);

    // check width on each submenu and place within bounds - if item is too large for container, reposition submenu wrapper
    $mainMenuLevel1.each(function () {
        var $this = $j(this);
        var colitemswidth = $this.outerWidth(true),
		parentposition = $this.offsetParent().position().left;
        if (parentposition + colitemswidth > containerwidth) {
            var newLeftPos = Math.round(((parentposition + colitemswidth) - (containerwidth + 5)));
            if (newLeftPos >= 0) { // In rare cases a value of -1 has been seen in IE. This is to compensate.
                $j(this).css("left", "-" + newLeftPos + "px");
            }
        };
    });

}

/* System Functions */


/* INPUT FIELD HINT TEXT FROM TITLE */
/* Called from document ready above */
$j.fn.hint = function () {
  return this.each(function (){
    // get jQuery version of 'this'
    var t = $j(this); 
    // get it once since it won't change
    var title = t.attr('title'); 
        
    // only apply logic if the element has the attribute
    if (title) { 
      // on blur, set value to title attr if text is blank
      t.blur(function (){
        if (t.val() == '' || t.val() == title) {
          t.val(title);
          t.addClass('blur');
        }
      });
      // on focus, set value to blank if current value 
      // matches title attr
      t.focus(function (){
        if (t.val() == title) {
          t.val('');
          t.removeClass('blur');
        }
      });

      // clear the pre-defined text when form is submitted
      t.parents('form:first').submit(function(){
          if (t.val() == title) {
              t.val('');
              t.removeClass('blur');
          }
      });

      // now change all inputs to title
      t.blur();
    }
  });
}


/* CLEAR HINT TEXT - USUALLY CALLED BEFORE SUBMIT */
function clearHintText(container) {
	$j("input, textarea", container).each(function(){
		$this = $j(this);
		if (($this.val()==$this.attr('title')) && $this.hasClass('blur')) $this.val('');
	});
}














/**
* SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
*
* SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
* http://www.opensource.org/licenses/mit-license.php
*
*/
if (typeof deconcept == "undefined") { var deconcept = new Object(); } if (typeof deconcept.util == "undefined") { deconcept.util = new Object(); } if (typeof deconcept.SWFObjectUtil == "undefined") { deconcept.SWFObjectUtil = new Object(); } deconcept.SWFObject = function (_1, id, w, h, _5, c, _7, _8, _9, _a) { if (!document.getElementById) { return; } this.DETECT_KEY = _a ? _a : "detectflash"; this.skipDetect = deconcept.util.getRequestParameter(this.DETECT_KEY); this.params = new Object(); this.variables = new Object(); this.attributes = new Array(); if (_1) { this.setAttribute("swf", _1); } if (id) { this.setAttribute("id", id); } if (w) { this.setAttribute("width", w); } if (h) { this.setAttribute("height", h); } if (_5) { this.setAttribute("version", new deconcept.PlayerVersion(_5.toString().split("."))); } this.installedVer = deconcept.SWFObjectUtil.getPlayerVersion(); if (!window.opera && document.all && this.installedVer.major > 7) { deconcept.SWFObject.doPrepUnload = true; } if (c) { this.addParam("bgcolor", c); } var q = _7 ? _7 : "high"; this.addParam("quality", q); this.setAttribute("useExpressInstall", false); this.setAttribute("doExpressInstall", false); var _c = (_8) ? _8 : window.location; this.setAttribute("xiRedirectUrl", _c); this.setAttribute("redirectUrl", ""); if (_9) { this.setAttribute("redirectUrl", _9); } }; deconcept.SWFObject.prototype = { useExpressInstall: function (_d) { this.xiSWFPath = !_d ? "expressinstall.swf" : _d; this.setAttribute("useExpressInstall", true); }, setAttribute: function (_e, _f) { this.attributes[_e] = _f; }, getAttribute: function (_10) { return this.attributes[_10]; }, addParam: function (_11, _12) { this.params[_11] = _12; }, getParams: function () { return this.params; }, addVariable: function (_13, _14) { this.variables[_13] = _14; }, getVariable: function (_15) { return this.variables[_15]; }, getVariables: function () { return this.variables; }, getVariablePairs: function () { var _16 = new Array(); var key; var _18 = this.getVariables(); for (key in _18) { _16[_16.length] = key + "=" + _18[key]; } return _16; }, getSWFHTML: function () { var _19 = ""; if (navigator.plugins && navigator.mimeTypes && navigator.mimeTypes.length) { if (this.getAttribute("doExpressInstall")) { this.addVariable("MMplayerType", "PlugIn"); this.setAttribute("swf", this.xiSWFPath); } _19 = "<embed type=\"application/x-shockwave-flash\" src=\"" + this.getAttribute("swf") + "\" width=\"" + this.getAttribute("width") + "\" height=\"" + this.getAttribute("height") + "\" style=\"" + this.getAttribute("style") + "\""; _19 += " id=\"" + this.getAttribute("id") + "\" name=\"" + this.getAttribute("id") + "\" "; var _1a = this.getParams(); for (var key in _1a) { _19 += [key] + "=\"" + _1a[key] + "\" "; } var _1c = this.getVariablePairs().join("&"); if (_1c.length > 0) { _19 += "flashvars=\"" + _1c + "\""; } _19 += "/>"; } else { if (this.getAttribute("doExpressInstall")) { this.addVariable("MMplayerType", "ActiveX"); this.setAttribute("swf", this.xiSWFPath); } _19 = "<object id=\"" + this.getAttribute("id") + "\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\"" + this.getAttribute("width") + "\" height=\"" + this.getAttribute("height") + "\" style=\"" + this.getAttribute("style") + "\">"; _19 += "<param name=\"movie\" value=\"" + this.getAttribute("swf") + "\" />"; var _1d = this.getParams(); for (var key in _1d) { _19 += "<param name=\"" + key + "\" value=\"" + _1d[key] + "\" />"; } var _1f = this.getVariablePairs().join("&"); if (_1f.length > 0) { _19 += "<param name=\"flashvars\" value=\"" + _1f + "\" />"; } _19 += "</object>"; } return _19; }, write: function (_20) { if (this.getAttribute("useExpressInstall")) { var _21 = new deconcept.PlayerVersion([6, 0, 65]); if (this.installedVer.versionIsValid(_21) && !this.installedVer.versionIsValid(this.getAttribute("version"))) { this.setAttribute("doExpressInstall", true); this.addVariable("MMredirectURL", escape(this.getAttribute("xiRedirectUrl"))); document.title = document.title.slice(0, 47) + " - Flash Player Installation"; this.addVariable("MMdoctitle", document.title); } } if (this.skipDetect || this.getAttribute("doExpressInstall") || this.installedVer.versionIsValid(this.getAttribute("version"))) { var n = (typeof _20 == "string") ? document.getElementById(_20) : _20; n.innerHTML = this.getSWFHTML(); return true; } else { if (this.getAttribute("redirectUrl") != "") { document.location.replace(this.getAttribute("redirectUrl")); } } return false; } }; deconcept.SWFObjectUtil.getPlayerVersion = function () { var _23 = new deconcept.PlayerVersion([0, 0, 0]); if (navigator.plugins && navigator.mimeTypes.length) { var x = navigator.plugins["Shockwave Flash"]; if (x && x.description) { _23 = new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/, "").replace(/(\s+r|\s+b[0-9]+)/, ".").split(".")); } } else { if (navigator.userAgent && navigator.userAgent.indexOf("Windows CE") >= 0) { var axo = 1; var _26 = 3; while (axo) { try { _26++; axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash." + _26); _23 = new deconcept.PlayerVersion([_26, 0, 0]); } catch (e) { axo = null; } } } else { try { var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); } catch (e) { try { var axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); _23 = new deconcept.PlayerVersion([6, 0, 21]); axo.AllowScriptAccess = "always"; } catch (e) { if (_23.major == 6) { return _23; } } try { axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash"); } catch (e) { } } if (axo != null) { _23 = new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(",")); } } } return _23; }; deconcept.PlayerVersion = function (_29) { this.major = _29[0] != null ? parseInt(_29[0]) : 0; this.minor = _29[1] != null ? parseInt(_29[1]) : 0; this.rev = _29[2] != null ? parseInt(_29[2]) : 0; }; deconcept.PlayerVersion.prototype.versionIsValid = function (fv) { if (this.major < fv.major) { return false; } if (this.major > fv.major) { return true; } if (this.minor < fv.minor) { return false; } if (this.minor > fv.minor) { return true; } if (this.rev < fv.rev) { return false; } return true; }; deconcept.util = { getRequestParameter: function (_2b) { var q = document.location.search || document.location.hash; if (_2b == null) { return q; } if (q) { var _2d = q.substring(1).split("&"); for (var i = 0; i < _2d.length; i++) { if (_2d[i].substring(0, _2d[i].indexOf("=")) == _2b) { return _2d[i].substring((_2d[i].indexOf("=") + 1)); } } } return ""; } }; deconcept.SWFObjectUtil.cleanupSWFs = function () { var _2f = document.getElementsByTagName("OBJECT"); for (var i = _2f.length - 1; i >= 0; i--) { _2f[i].style.display = "none"; for (var x in _2f[i]) { if (typeof _2f[i][x] == "function") { _2f[i][x] = function () { }; } } } }; if (deconcept.SWFObject.doPrepUnload) { if (!deconcept.unloadSet) { deconcept.SWFObjectUtil.prepUnload = function () { __flash_unloadHandler = function () { }; __flash_savedUnloadHandler = function () { }; window.attachEvent("onunload", deconcept.SWFObjectUtil.cleanupSWFs); }; window.attachEvent("onbeforeunload", deconcept.SWFObjectUtil.prepUnload); deconcept.unloadSet = true; } } if (!document.getElementById && document.all) { document.getElementById = function (id) { return document.all[id]; }; } var getQueryParamValue = deconcept.util.getRequestParameter; var FlashObject = deconcept.SWFObject; var SWFObject = deconcept.SWFObject;



/*
* Contains standard Tradelink javascript
*/

/*
----------------------
* "Global" variables 
*/
var cityControl;


/* 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;
}




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);
    }
}

