﻿"use strict";

/*///// [ NAMESPACE ] /////*/
var KVIK = {};


/*///// [ CURRENT CONTEXT ] /////*/
/* Dynamic generated by server in a script tag in the header - overwriting these values */
KVIK.CurrentContext = {
    language: null,
    rootStoreItemId: null,
    settingsItemId: null,
    favoriteStoreId: null
}

/*///// [ CONFIGURATION ] /////*/

// jQuery ajax configuration
jQuery.ajaxSetup({
	type: 'post',
	contentType: 'application/json; charset=utf-8',
	dataType: 'json'
});


/*///// [ UTILITIES ] /////*/

KVIK.Utils = {


    /*!
    JavaScript preload() function
    Preload images, CSS and JavaScript files without executing them
    Script by Stoyan Stefanov â€“ http://www.phpied.com/preload-cssjavascript-without-execution/
    Slightly rewritten by Mathias Bynens â€“ http://mathiasbynens.be/
    */
    preload: function (arr, callback) {
        var i = arr.length,
    	    d = document,
    	    b = d.body,
    	    isIE = "fileSize" in d,
    	    o;
        while (i--) {
            if (isIE) {
                o = new Image();
                o.onload = callback || null;
                o.src = arr[i];
                continue;
            }
            o = d.createElement("object");
            o.onload = callback || null;
            o.data = arr[i];
            o.width = o.height = 0;
            o.style.position = "absolute";
            b.appendChild(o);
        }
    },


    /* Dependencies for KVIK.Utils	
    jquery-1.4.2.min.js
    jquery.libs.js
    */

    ajax: function (options) {
        var defaults = {
            data: {},
            url: '',
            success: function (result) {
                var res = eval(result); res = eval('(' + res.d + ')');
                if (jQuery.isFunction(options.callBack)) options.callBack(res);
            }
        }
        var opts = jQuery.extend({}, defaults, options);
        opts.data = jQuery.toJSON(opts.data);
        jQuery.ajax(opts);
    },
    query: function (name) {
        var results = new RegExp('[\\?&]' + name + '=([^&#]*)').exec(window.location.href);
        if (!results) { return 0; }
        return results[1] || 0;

    },
    isLocal: window.location.href.indexOf(".html") > 0 || window.location.href.indexOf("demo.in2media.dk/targetti_poulsen") > 0
}

/*///// [ jQUERY CUSTOM PLUGINS ] /////*/



;            (function($) {
// DISABLE TEXT SELECTION 
    $.fn.extend({
        disableTextSelect: function() {
            return this.each(function() {
                if ($.browser.mozilla) {//Firefox
                    $(this).css('MozUserSelect', 'none');
                } else if ($.browser.msie) {//IE
                    $(this).bind('selectstart', function() { return false; });
                } else {//Opera, etc.
                    $(this).mousedown(function() { return false; });
                }
            });
        }
    });
})(jQuery);

jQuery.extend({
    jYoutube: function (url, size) {
        if (url === null) { return ""; }

        size = (size === null) ? "big" : size;
        var vid;
        var results;

        results = url.match("[\\?&]v=([^&#]*)");

        vid = (results === null) ? url : results[1];

        if (size == "small") {
            return "http://img.youtube.com/vi/" + vid + "/2.jpg";
        } else {
            return "http://img.youtube.com/vi/" + vid + "/0.jpg";
        }
    }
});

//cookie
function setCookie(name, value, days) {
    if (days) {
        var date = new Date();
        date.setTime(date.getTime()+(days*24*60*60*1000));
        var expires = "; expires="+date.toGMTString();
    }
    else var expires = "";
    document.cookie = name+"="+value+expires+"; path=/";
}

function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i=0;i < ca.length;i++) {
        var c = ca[i];
        while (c.charAt(0)==' ') c = c.substring(1,c.length);
        if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
    return null;
}

function deleteCookie(name) {
    setCookie(name,"",-1);
}
/*
 * jQuery.unparam v1.2
 *	Author Atli Adalsteinsson
 */
jQuery.unparam=function(a){var d,b,e,c,a=a.split("&");if(e=a.length){d={};for(b=0;b<e;b++)c=a[b].split("=",2),c.length==2&&(d[decodeURIComponent(c[0])]=decodeURIComponent(c[1].replace(/\+/g," ")))}return d};

/*
	jQuery.radioList
	Author Atli Adalsteinsson
*/
(function ($) {
	$.fn.radioList = function (options) {
		return $(this).each(function () {
			var $RadioList = $(this), 
				$Radios = $RadioList.find("> li > a"),
				_update = function(){
					var	$Active = $RadioList.find("a.active");
					//Sets the radiolist data-value to the active radio's name attributes
					if($Active.length){
						$RadioList.data("value",$Active.attr("name"));
						$RadioList.data("selection",$Active.find("a.active").text());
					} else {
						$RadioList.data("value", "");
						$RadioList.data("selection", "");
					}
				},
				_change = function(){
					$RadioList.trigger("update");
					$RadioList.trigger("change");
				};
			
			$RadioList.find("> a:first").addClass("first");
			$RadioList.find("> a:last").addClass("last");
			
			if($Radios.length === 1) {
				$Radios.addClass("active");
			}
			
			$Radios.click(function(evt){
				var $Radio = $(this),
					$Siblings = $Radio.parent().siblings();
					
				if(!$Radio.is(".disabled") && !$Radio.is(".active")) {
					//If the radio isn't alone toggle active 
					if($Siblings.length !== 0) {
						$Siblings.find("a.active").removeClass("active");
						$Radio.addClass("active");
						_change();
					}
				}
				evt.preventDefault();
				return false;
				
			}).hover(function(){$(this).addClass("over");},function(){$(this).removeClass("over")}).wrapInner("<span></span>");
			$RadioList.bind("reset", function(){
				var $Radios = $(this).find('a');
				if($Radios.length > 1){
					$Radios.filter(".active").removeClass("active");
					_change();
				}
			}).bind("update", function(){
				//log("update", this, arguments)
				_update();
			});
			_update();
		});
	};
})(jQuery);

/*
	jQuery.dataTable
	Author Atli Adalsteinsson
*/
(function ($) {
	$.fn.dataTable = function (options) {
		var _jqXHR = {},
			_defaults = $.extend(true, {
				perPage: 3,
				pagingBtns: 9,
				caption: {
				},
				parameters: {
					currentPage: 1
				},
				init: true,
				fade: true,
				ajaxError: function () {},
				styleElements: function () {}
			}, options),
			
			_startLoading = function ($Element) {
				var pos = 0, fps = 1000/30,
					$Indicator = $('<div class="loading-indicator"></div>').prependTo($Element);
				
				clearInterval($Element.data("loading"));
				
				$Element.addClass("loading").data("loading", setInterval(function () {
					pos = (pos < 7) ? pos + 1 : 0;
					$Indicator.css({
						"background-position": Math.round(-35 * pos) + 'px 0px'
					});
				}, fps)).find(".data-container").stop(true, true).css({
					"opacity": 0.8
				});
			},
			
			_finishLoading = function ($Element) {
				$Element.data("jqXHR", false).removeClass("loading");
				clearInterval($Element.data("loading"));
				$Element.find(".loading-indicator").remove();
				if ($Element.data("settings").fade) {
					$Element.find(".data-container").stop(true, true).animate({
						"opacity": 1
					}, 200, function () {
						$(this).removeAttr("style");
					});
				} else {
					$Element.find(".data-container").removeAttr("style");
				}
			},
			
			
			_noResults = function ($Element) {
				$Element.find(".no-results").show();
				$Element.find(".pagination").hide();
				$Element.find(".data-container").empty().hide();
			},
			
			_abortLoading = function ($Element) {
				$Element.data("jqXHR").abort();
				$Element.data("jqXHR", false).removeClass("loading");
				clearInterval($Element.data("loading"));
				$Element.find(".loading-indicator").remove();
				$Element.find(".data-container").removeAttr("style");
			},
			_callAjax = function ($Element, url, query, callback) {
				var jsonpCallback = url.slice(url.lastIndexOf("/") + 1).split(".json")[0].split(".ashx")[0];
				if (KVIK.Utils.isLocal) {
					$.ajaxSetup({
						jsonpCallback: jsonpCallback,
						crossDomain: true
					});
				}
				if ($Element.data("jqXHR")) {
					_abortLoading($Element);
				}
				_startLoading($Element);
                
				$Element.data("jqXHR", $.ajax({
					type: "post",
					url: url,
					cache: false,
					data: query,
					contentType: "application/x-www-form-urlencoded",
					dataType: "jsonp",
					success: function (data, textStatus, XMLHttpRequest) {
						if (typeof(data.operation) === "object" && data.operation.success && typeof(data.collection) === "object") {
							callback($Element, data.collection);
						} else {
							$Element.data("settings").ajaxError("ERROR", "SERVER ERROR", data.error + " " + url + " " + $.param(query));
							log("ERROR", "SERVER ERROR", data.error + " " + url + " " + $.param(query));
						}
						_finishLoading($Element);
					},
					error: function (jqXHR, textStatus, errorThrown) {
						_finishLoading($Element);
						$Element.data("settings").ajaxError("ERROR", "HTTP ERROR", errorThrown + " " + url + " " + $.param(query));
						log(jqXHR);					
						log("textStatus: " + textStatus + "\n- errorThrown: " + errorThrown);
					}
				}));
			},
			
			_getPageData = function ($Element, callback) {
				var dataPosition, postData;
				
				postData = $.extend(true, {
					"perPage": $Element.data("settings").perPage
				}, $Element.data("settings").parameters, $Element.data("settings").query);
				_callAjax($Element, $Element.data("settings").path, postData, function ($Element, data) {
					$Element.data("settings").totalItems = data.totalItems;
					if (data.totalItems > 0) {
						$Element.find(".no-results").hide();
						$Element.data("viewDataset", {
							"items": data.items.slice(0, $Element.data("settings").perPage)
						});
						$Element.data("settings").totalPages = Math.ceil(data.totalItems / $Element.data("settings").perPage);
						
						callback($Element, data);
					} else {
						_noResults($Element);
					}
				});
				
			},
			

			
			_buildPagingBtns = function ($Element) {
				var startBtn, i, rangeBtns, $PagingBtns, paging = '',
					currentPage = $Element.data("settings").parameters.currentPage,
					totalPages = $Element.data("settings").totalPages,
					pagingBtns = $Element.data("settings").pagingBtns,
					getBtn = function (index) {
						return '<a rel="' + index + '" class="page' + ((index === currentPage) ? ' active' : '') + '" href="javascript:"><span>' + index + '</span></a>';
					};
				if (totalPages > 1) {
					if (totalPages > pagingBtns) {
						rangeBtns = pagingBtns - 2;
						startBtn = (currentPage + 3 >= totalPages) ? totalPages - rangeBtns : Math.max(2, currentPage - 3);
						paging = getBtn(1);
						for (i = 0; i < rangeBtns; i = i + 1) {
							if (i === 0 && startBtn > 2) {
								paging = paging + '<span class="spacer">&hellip;</span>';
							} else if (i === rangeBtns - 1 && startBtn + i < totalPages - 1) {
								paging = paging + '<span class="spacer">&hellip;</span>';
							} else {
								paging = paging + getBtn(i + startBtn);
							}
						}
						paging = paging + getBtn(totalPages);
					} else {
						for (i = 0; i < totalPages; i = i + 1) {
							paging = paging + getBtn(i + 1);
						}
					}
				}
				return paging;
			},
			
			_changePage = function ($Element, newPage) {
				var currentPage = $Element.data("settings").parameters.currentPage,
					totalPages = $Element.data("settings").totalPages;
				if (newPage > totalPages) {
					newPage = totalPages;
				} else if (newPage < 1) {
					newPage = 1;
				}
				if (newPage !== currentPage) {
					$Element.data("settings").parameters.currentPage = newPage;
					_update($Element);
                    $Element[0].scrollIntoView();
				}
			},
			
			_buildPaging = function ($Element) {
				var $Paging = $('<div class="pagination"></div>').append(_buildPagingBtns($Element)),
					$TE = $Element;
				$Paging.click(function (evt) {
					var newPage = null,
						$Target = $(evt.target);
					if ($Target.is("a, span")) {
						$Target = $Target.is("span") ? $Target.parent() : $Target;
						if ($Target.is("a.page")) {
							newPage = Number($Target.attr("rel"));
						} 
						if (newPage !== null) {
							_changePage($TE, newPage);
						}
					}
                    return false;
				});
				$Element.append($Paging);
			},
			
			_fillList = function ($Element) {
				if (!$.isFunction($Element.data("template").deal)) {
					log("ERROR: list template missing");
				} else {
					$Element.find("div.data-container > ul").empty().append($.tmpl($Element.data("template").deal, $Element.data("viewDataset").items));
					$Element.data("settings").styleElements($Element);
				}
			},
			
			_viewList = function ($Element) {
				var $Ul, $Dataset = $Element.find("div.data-container").show();
				$Ul = $('<ul class="floatContainer"></ul>');
				$Dataset.empty().append($Ul);
				_fillList($Element);
			},
			
			_init = function ($Element) {
				_getPageData($Element, function ($Element) {
					$Element.data("settings").init = true;
					_viewList($Element);
					_buildPaging($Element);
				});
			},
			
			_updatePaging = function ($Element) {
				$Element.find('.pagination').html(_buildPagingBtns($Element)).show();
			},
			
			_update = function ($Element) {
				_updatePaging($Element);
				_getPageData($Element, function ($Element) {
					_viewList($Element);
				});
			};
			
		return $(this).not(".ready").each(function () {
			var $Element = $(this),
				localSettings = {},
				templates = {};
				
			$Element.addClass("ready").find(".no-results").hide();
			localSettings.caption = {};
			localSettings.parameters = {};
			
			$Element.find(".meta").children().map(function () {
				var $Tag = $(this);
				if ($Tag.is("span")) {
					localSettings.caption[$Tag.attr("class")] = $Tag.text();
				} else if ($Tag.is("a")) {
					localSettings[$Tag.attr("class")] = $Tag.attr("href");
				} else if ($Tag.is("code")) {
					localSettings.parameters[$Tag.attr("class")] = $Tag.text();
				} else if ($Tag.is("pre")) {
					templates[$Tag.attr("class")] = $.template($Tag.find("script"));
				} 
			});
			
			$Element
				.data("settings", $.extend(true, {}, _defaults, localSettings))
				.data("template", templates);
			
			if (!$Element.find(".data-container").length) {
				$Element.append('<div class="data-container" />');
			}

			$Element.bind("update", function (evt, query, c) {
				var $Element = $(this),
					callback = c;
				$Element.data("settings").query = query;
				$Element.data("settings").parameters.currentPage = 1;
				_getPageData($Element, function ($Element, data) {					
					_viewList($Element);
					if (!$Element.data("settings").init) {
						$Element.data("settings").init = true;
						_buildPaging($Element);
					} else {
						_updatePaging($Element);
					}
					if ($.isFunction(callback)) {
						callback(data);
					}
				});
			});
			
			if ($Element.data("settings").init) {
				_init($Element);
			}
		});
	};
})(jQuery);
/*
	jQuery.dataTable
	Author Atli Adalsteinsson
*/

(function ($) {
	$.fn.slider = function (options) {
		var _jqXHR = {},
			_settings = $.extend(true, {
				page : 0,
				aniTime : 400,
				autoTimer : 10000,
				onChange : function($Ul, page, totalPages){}
			}, options);
			
		return $(this).not(".ready").each(function () {	
			var $SliderContainer = $(this).wrap("<div class='ui-slider-container'></div>").parent(),
				$SliderList = $(this).wrap("<div class='ui-slider-list'></div>").parent(),
				$Ul = $(this).addClass("ready"),
				boxWidth = $Ul.children("li:first").width(),
				totalBoxes = $Ul.children("li").length,			
				fitBoxes = Math.floor($SliderContainer.width() / boxWidth),
				showBoxes = (fitBoxes < 1) ? 1 : fitBoxes,			
				totalMargin = ($SliderContainer.width() - (showBoxes*boxWidth)),
				BoxMargin,
				moveWidth = showBoxes * boxWidth,	
				totalWidth = boxWidth * totalBoxes,
				totalPages = Math.ceil(totalBoxes / showBoxes),
				$NavDiv,
				$NavA,
				
				changePage = function (newPage) {
					$NavDiv.children('a.ui-slider-page:eq(' + _settings.page + ')').removeClass("ui-slider-active");
					if (newPage >= totalPages) {
						_settings.page = 0;
					} else if (0 > newPage) {
						_settings.page = newPage + totalPages;
					} else {
						_settings.page = newPage;
					}
					$NavDiv.children('a.ui-slider-page:eq(' + _settings.page + ')').addClass("ui-slider-active");
					var movToY = -moveWidth * _settings.page;
					$Ul.stop(true).animate({
						'left': movToY
					}, {
						duration: _settings.aniTime,
						queue: false,
						easing: "easeInOutExpo"
					});
					_settings.onChange($Ul, _settings.page, totalPages)
				},
				
				nextPage = function () {
					changePage(_settings.page + 1);
				};
			
			
			
			if(totalMargin>showBoxes){
				BoxMargin =  totalMargin / (showBoxes-1);
				boxWidth = boxWidth+BoxMargin;
				$Ul.children("li").css("margin", "0 " + BoxMargin + " 0 0");
			}
			if (totalPages > 1) {
				$Ul.css("width", totalWidth + "px");
				$NavDiv = $('<div class="ui-slider-nav"></div>')
		
				for (var i = 0; i < totalPages; i++) {
					if (i == _settings.page) {
						$NavA = $('<a class="ui-slider-page ui-slider-active" href="javascript:void(0)">&nbsp;</a>').appendTo($NavDiv)
					} else {
						$NavA = $('<a class="ui-slider-page" href="javascript:void(0)">&nbsp;</a>').appendTo($NavDiv)
					}
					$NavA.data("navid", i);
					$NavA.bind("click", function (e) {
						changePage(parseInt($(this).data("navid")));
					});
				}
				
				$('<a class="ui-slider-forw-btn" href="">&nbsp;</a>').bind('click', function () {
					autoPlay.stop($SliderContainer);
					changePage(_settings.page + 1);
					//$(this).blur();
					return false;
				}).appendTo($SliderContainer);
		
				$('<a class="ui-slider-prev-btn" href="">&nbsp;</a>').bind('click', function () {
					autoPlay.stop($SliderContainer);
					changePage(_settings.page - 1);
					//$(this).blur();
					return false;
				}).appendTo($SliderContainer);	
				
				$SliderContainer.append($NavDiv);
				if($Ul.is(".autoplay")) {
					autoPlay.register($SliderContainer, nextPage, _settings.autoTimer);
				}
				

			}
		
		});
	};
})(jQuery);



/*
	autoPlay
	Author Atli Adalsteinsson
*/
var autoPlay = {	
	elements : [],
	init : false,
	disabled : false,
	scrollTimer : 0,
	support : !($.browser.msie && Number($.browser.version.split(".")[0]) < 7),	
	
	initManager : function (){
		if(!autoPlay.init && autoPlay.support){
			$(window).scroll(function () {
				if(!autoPlay.disabled) {
					clearTimeout(autoPlay.scrollTimer)
					autoPlay.scrollTimer = setTimeout(function(){
						autoPlay.checkAll();
					}, 500);
					
				}
			});
			$(window).blur(function () {
				$.each(autoPlay.elements, function(index, element){
					autoPlay.stop(element);
				});
			});
			$(window).focus(function () {
				if(!autoPlay.disabled) {
					autoPlay.checkAll();
				}
			});
			autoPlay.init = true;
		}
	},
	check : function(element, windowHeight, windowScrollTop){
		var $Element = $(element),
			eTop = $Element.offset().top,
			eBottom = eTop + $Element.height(),
			top 	= (eTop > windowScrollTop && eTop < windowHeight+windowScrollTop),
			bottom 	= (eBottom > windowScrollTop && eBottom < windowHeight+windowScrollTop);
			
		if(top || bottom){
			if(!$Element.data("playing")){
				 autoPlay.start($Element);
			} 			
		} else {
			if($Element.data("playing")){
				 autoPlay.stop($Element);
			}
		}
	},
	
	register : function($Element, functionRef, interval){
		autoPlay.initManager();
		autoPlay.elements.push($Element);
		$Element.data({
			'functionRef'	: functionRef,
			'interval'		: interval
		});
		autoPlay.check($Element, $(window).height(), $(window).scrollTop());
	},
	start : function($Element){
		if($Element.data && autoPlay.support){
			autoPlay.stop($Element);
			var timer = setInterval($Element.data("functionRef"), $Element.data("interval"));
			$Element.data({
				'timer'			: timer,
				'playing'		: true
			});
		}
	},
	stop : function($Element){
		if($Element.data){
			clearInterval($Element.data('timer'));
			$Element.data({
				'timer'			: 0,
				'playing'		: false
			});
		}
	},
	
	stopAll : function(){
		autoPlay.disabled = true;
		$.each(autoPlay.elements, function(index, element){
			autoPlay.stop(element);
		});
	},
	startAll : function(){
		autoPlay.disabled = false;
		autoPlay.checkAll();
	},	
	checkAll : function(){
		$.each(autoPlay.elements, function(index, element){
			autoPlay.check(element,  $(window).height(), $(window).scrollTop());
		});
	
	}
}




/*
// usage: log('inside coolFunc', this, arguments);
window.log = function(){
  log.history = log.history || [];   // store logs to an array for reference
  log.history.push(arguments);
  if(window.console) {
      arguments.callee = arguments.callee.caller;
      console.log( Array.prototype.slice.call(arguments) );
  }
};
(function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,markTimeline,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();)b[a]=b[a]||c})(window.console=window.console||{});
window.trace = window.log;
*/


/**!
    @description            Safe console.log - modified to work in strict mode
    @usage                  
                            console.log("whatever");
                            log("whatever");
                            trace("whatever");
*/
window.log = function () {
  log.history = log.history || [];   // store logs to an array for reference
  log.history.push(arguments);
  if (window.console) {
    var newarr = [].slice.call(arguments);
    (typeof console.log === 'object' ? log.apply.call(console.log, console, newarr) : console.log.apply(console, newarr));
  }
};
(function(b){function c(){}for(var d="assert,count,debug,dir,dirxml,error,exception,group,groupCollapsed,groupEnd,info,log,timeStamp,profile,profileEnd,time,timeEnd,trace,warn".split(","),a;a=d.pop();){b[a]=b[a]||c}})((function(){try
{console.log();return window.console;}catch(err){return window.console={};}})());
window.trace = window.log;
