
if(!Array.prototype.indexOf){Array.prototype.indexOf=function(elt){var len=this.length;var from=Number(arguments[1])||0;from=(from<0)?Math.ceil(from):Math.floor(from);if(from<0){from+=len;}
for(;from<len;from++){if(from in this&&this[from]===elt){return from;}}
return-1;};}
Array.prototype.contains=function(object){if(this.indexOf(object)>=0){return true;}
return false;};Array.prototype.find=function(object){var ret=false;var exactMatch=true;var allOccurrence=true;if(typeof arguments[1]==='boolean'){exactMatch=arguments[1];}
if(typeof arguments[2]==='boolean'){allOccurrence=arguments[2];}
for(var i=0,len=this.length;i<len;i++){if(typeof object==='function'){if(object.test(this[i])){if(allOccurrence){if(!ret){ret=[];}
ret.push(i);}else{ret=true;break;}}}else{if(exactMatch&&this[i]===object){if(allOccurrence){if(!ret){ret=[];}
ret.push(i);}else{ret=true;break;}}else if(!exactMatch&&this[i].indexOf(object)>=0){if(allOccurrence){if(!ret){ret=[];}
ret.push(i);}else{ret=true;break;}}}}
return ret;};function namespace(str){var parts=str.split('.'),parent=window,part='';for(var i=0,len=parts.length;i<len;i++){part=parts[i];parent[part]=parent[part]||{};parent=parent[part];}
return parent;};function parseUri(str){var o=parseUri.options,m=o.parser[o.strictMode?"strict":"loose"].exec(str),uri={},i=14;while(i--){uri[o.key[i]]=m[i]||"";}
uri[o.q.name]={};uri[o.key[12]].replace(o.q.parser,function($0,$1,$2){if($1){uri[o.q.name][$1]=$2;}});return uri;};parseUri.options={strictMode:false,key:["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],q:{name:"queryKey",parser:/(?:^|&)([^&=]*)=?([^&]*)/g},parser:{strict:/^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,loose:/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@]*)(?::([^:@]*))?)?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/}};


// All supported symbolic targets:
GmdsCmsLinks.BUILD_YOUR_OWN = "byo"; //vehicleSpecific
GmdsCmsLinks.COMPARE_TRIMS = "cpt";
GmdsCmsLinks.DEALER_LOCATOR = "lad";
GmdsCmsLinks.MODEL_OVERVIEW = "mov"; //vehicleSpecific
GmdsCmsLinks.REQUEST_A_BROCHURE = "rab";
GmdsCmsLinks.REQUEST_A_QUOTE = "raq";
GmdsCmsLinks.REQUEST_A_TEST_DRIVE = "rtd";
GmdsCmsLinks.PLAN_A_ROUTE = "plr";
GmdsCmsLinks.REQUEST_NEWSLETTER = "rnl";
GmdsCmsLinks.SEARCH_INVENTORY ="lnv";
GmdsCmsLinks.COMPETITIVE_FEATURE_COMPARISON ="cfc"; //vehicleSpecific
GmdsCmsLinks.COMPETITIVE_PHOTO_COMPARISON ="cpc"; //vehicleSpecific
GmdsCmsLinks.ESTIMATE_PAYMENTS ="epm";
GmdsCmsLinks.VIEW_CURRENT_OFFERS ="vco";
GmdsAppParams.LIFETIME_SESSION = "session";
GmdsAppParams.LIFETIME_PERSISTENT = "persistent";

function GmdsAppParams() {
	var cookieParams = {};
	
	function appendParams() {
		var sl = mrm.$("#container a.shppngLnk");
		mrm.$.each(sl, function(){		
			for (var name in cookieParams) {
				if (mrm.$(this).hasClass("sl-" + name)) {
					var href = mrm.$(this).attr("href");
					if (href !== undefined && href.length > 0) {
						var parsed = parseUri(href);
						var newQuery = "", hasQueryStr = parsed.query.length > 0;
						var temp = "", count = 0, firstRun = false;
						for (var key in cookieParams[name]) {
							if (hasQueryStr || firstRun) {
								temp = temp + "&" + key + "=" + cookieParams[name][key];
							} else {
								temp = key + "=" + cookieParams[name][key];
								firstRun = true;
							}
						}
						if (hasQueryStr) {
							newQuery = "?" + parsed.query + temp;
						} else {
							newQuery = "?" + temp;
						}
						var url = (parsed.protocol.length > 0 ? parsed.protocol + "://" : "") + 
							(parsed.host.length > 0 ? parsed.host : "") + (parsed.port.length > 0 ? ":" + parsed.port : "") + 
							parsed.path + newQuery + (parsed.anchor.length > 0 ? "#" + parsed.anchor : "");
						mrm.$(this).attr("href", url);
					}
				}
			}
		});		
	}	
	function hasParams(/*lifetime*/) {
		var cookie = gmds.getCookie("session-gmds-app-params");
		var hasAppParams;
		
		if (null === cookie) {
			hasAppParams = false;
		} else {
			hasAppParams = false;
			var obj = JSON.parse(cookie);
			var targets = [
				GmdsCmsLinks.BUILD_YOUR_OWN,GmdsCmsLinks.COMPARE_TRIMS,
				GmdsCmsLinks.DEALER_LOCATOR,GmdsCmsLinks.MODEL_OVERVIEW,
				GmdsCmsLinks.REQUEST_A_BROCHURE,GmdsCmsLinks.REQUEST_A_QUOTE,
				GmdsCmsLinks.REQUEST_A_TEST_DRIVE,GmdsCmsLinks.PLAN_A_ROUTE,
				GmdsCmsLinks.REQUEST_NEWSLETTER,GmdsCmsLinks.SEARCH_INVENTORY,
				GmdsCmsLinks.COMPETITIVE_FEATURE_COMPARISON,GmdsCmsLinks.COMPETITIVE_PHOTO_COMPARISON,
				GmdsCmsLinks.ESTIMATE_PAYMENTS,GmdsCmsLinks.VIEW_CURRENT_OFFERS];
			for (var i = 0; i < targets.length; i++) {
				if (obj.hasOwnProperty(targets[i])) {
					hasAppParams = true;
					cookieParams = obj;
					break;
				}
			}
		}
		return hasAppParams;
	}
	function setParam(appID, key, value /*, lifetime*/) {
		var cookie = gmds.getCookie("session-gmds-app-params");
		if (null === cookie) {
			gmds.setCookie("session-gmds-app-params", "{\"" + appID + "\":{\"" + key + "\":\"" + value + "\"}}", null, "/");
		} else {
			var obj = JSON.parse(cookie);
			if (obj.hasOwnProperty(appID)) {
				obj[appID][key] = value;
			} else {
				var newKey = {};
				newKey[key] = value;
				obj[appID] = newKey;
			}				
			gmds.setCookie("session-gmds-app-params", JSON.stringify(obj), null, "/");
		}
	}	
	function deleteParam(appID, key) {
		var cookie = gmds.getCookie("session-gmds-app-params");
		if (null !== cookie) {
			var obj = JSON.parse(cookie);
			if (obj.hasOwnProperty(appID) && obj[appID].hasOwnProperty(key)) {
				delete obj[appID][key];
				gmds.setCookie("session-gmds-app-params", JSON.stringify(obj), null, "/");
			}
		}
	}	
	return {
		setAppParam: setParam,
		deleteAppParam: deleteParam,
		hasAppParams: hasParams,
		appendAppParams: appendParams
	}
};

function GmdsCmsLinksUtil(){

	/*function to add a params to an url*/
	this.appendParams = function (/*String*/ url, /*String*/ params) {
		if (url && params && params.length > 0) {
			var qmIdx = url.indexOf("?");
			var hshIdx = url.indexOf("#");
			if (qmIdx == -1 && hshIdx == -1) {
				
				url = url + "?" + params;
			} else if (qmIdx != -1 && hshIdx < qmIdx) {
				
				url = url + "&" + params;
			} else if (qmIdx == -1 && hshIdx != -1) {
				
				url = url.substring(0, hshIdx) + "?" + params + url.substring(hshIdx, url.length);
			} else {
				
				url = url.substring(0, hshIdx) + "&" + params + url.substring(hshIdx, url.length);
			}
		}
		return url;
	};
}



function GmdsCmsLinks() {

	/* defines which links refer to a specific vehicle */
	var vehicleSpecificLinks = [GmdsCmsLinks.BUILD_YOUR_OWN, GmdsCmsLinks.COMPETITIVE_FEATURE_COMPARISON, GmdsCmsLinks.COMPETITIVE_PHOTO_COMPARISON,
								GmdsCmsLinks.MODEL_OVERVIEW, GmdsCmsLinks.SEARCH_INVENTORY];
	
	/* object which contains the data of all non-vehicle links*/					
	var linkdata = {"lad":{
			"url":"",
				"isPopup":false},"rab":{
			"url":"/tools/opel-telli-prospekt.html",
				"isPopup":false},"raq":{
			"url":"/tools/opel-palu-pakkumist.html",
				"isPopup":false},"rtd":{
			"url":"/tools/telli-proovisoit.html",
				"isPopup":false},"rnl":{
			"url":"/tools/opel-telli-uudiskiri.html",
				"isPopup":false},"lnv":{
			"url":"/content/opel/europe/estonia/nscwebsite/et/index.html",
				"isPopup":false},"vco":{
			"url":"",
				"isPopup":false},"epm":{
			"url":"",
				"isPopup":false}
	};
	
	/* object which contains the data of all vehicle specific links*/
	var vehicleLinkdata = {
			"01/01A05":{
				"mov":{
						"url":"/vehicles/opel-range/veoautod/vivaro/indeks.html","isPopup":false},"byo":{
						"url":"","isPopup":false},"cfc":{
						"url":"","isPopup":false},"cpc":{
						"url":"","isPopup":false},"lnv":{
						"url":"","isPopup":false}},
			"01/01B05":{
				"mov":{
						"url":"/vehicles/opel-range/veoautod/vivaro/indeks.html","isPopup":false},"byo":{
						"url":"","isPopup":false},"cfc":{
						"url":"","isPopup":false},"cpc":{
						"url":"","isPopup":false},"lnv":{
						"url":"","isPopup":false}},
			"01/01B06":{
				"mov":{
						"url":"/vehicles/opel-range/veoautod/vivaro/indeks.html","isPopup":false},"byo":{
						"url":"","isPopup":false},"cfc":{
						"url":"","isPopup":false},"cpc":{
						"url":"","isPopup":false},"lnv":{
						"url":"","isPopup":false}},
			"01/01D05":{
				"mov":{
						"url":"/vehicles/opel-range/veoautod/vivaro/indeks.html","isPopup":false},"byo":{
						"url":"","isPopup":false},"cfc":{
						"url":"","isPopup":false},"cpc":{
						"url":"","isPopup":false},"lnv":{
						"url":"","isPopup":false}}
	};
	
	/**
	 * Opens a CMS page. The page might be either opened instead of the 
	 * current page, or as a new pop-up page, depending on the configuration 
	 * of the page in the CMS.
	 * 
	 * @param symbolicName the symbolicName of the page that should be opened
	 * @param params a parameter string that may contain several request parameters separated by &amp;
	 * @param carlineCode the carline-code, only required if the page to be opened is vehicle-specific.
	 * @param bodystyleCode the bodystyle-code, only required of the page to be opened is vehicle-specific.
	 */
	this.openCmsPage = function(/*String*/ symbolicName, /*String*/ params, /*String*/ carlineCode, /*String*/ bodystyleCode, /*String*/ modelYear) {
		var myLinkdata;
		var isVehicleSpecific = vehicleSpecificLinks.contains(symbolicName);
		if (isVehicleSpecific && carlineCode && bodystyleCode) {
			if(modelYear && modelYear.length > 0){
				myLinkdata = vehicleLinkdata[modelYear + "/" + carlineCode + "/" + bodystyleCode];
			}else{
				myLinkdata = vehicleLinkdata[carlineCode + "/" + bodystyleCode];
			}
			if (!myLinkdata) {
				mrm.util.error("VehicleSpecific: myLinkdata is undefined");
				return;
			}
			var vld = myLinkdata[symbolicName];
			if (vld) {
				if (vld.url.length == 0) {
					var ld = linkdata[symbolicName];
					if (ld) {
						vld.url = ld.url;
					}
				}
			}
		} else {
			myLinkdata = linkdata;
		}
		
		var ld = myLinkdata[symbolicName];
		if (ld) {
			var url = getGmdsCmsLinksUtil().appendParams(ld.url, params);
			if (ld.isPopup) {
				var popupProps = "";
				popupProps += "height=" + ld.height;
				popupProps += ",width=" + ld.width;
				if (ld.scrollable) {
					popupProps += ",scrollbars=yes";
				} else {
					popupProps += ",scrollbars=no";
				}
				if (ld.resizable) {
					popupProps += ",resizable=yes";
				} else {
					popupProps += ",resizable=no";
				}
				window.open(url, "", popupProps);
			} else {
				document.location.href = url;
			}
		}else{
			mrm.util.error("wrong shopping link identifier: "+identifier);
			return;
		}
	}; 
}

mrm.$(document).ready(function() {
	var gmdsCmsLinksUtil = new GmdsCmsLinksUtil();
	var gmdsCmsLinks = new GmdsCmsLinks();
	var gmdsAppParams = new GmdsAppParams();

	window.getGmdsCmsLinks = function () {
		return gmdsCmsLinks;
	};	
	window.getGmdsCmsLinksUtil = function () {
		return gmdsCmsLinksUtil;
	};	
	window.getGmdsAppParams = function() {
		return gmdsAppParams;
	};	
	if (gmdsAppParams.hasAppParams()) {
		gmdsAppParams.appendAppParams();
	}
});
