/**
 * This file should contain code currently without a proper home.
 */


function genericDWRError(data, call) {
	//stateManager.showError("DWR call failed", "The function '" + call + "' encountered an error. Error: " + data);
	stateManager.showError(i18n.web_dwr_error_title,i18n.web_dwr_error_message);
	debug("DWR Error: '" + data + "' caused by call: " + call);
}


function fetchTranslatedMessage( key, lc, cc, callback ) {
	translationBean.getJsMessage(key, lc, cc, callback);
}

function loadCaptchaImage(uiUpdater) {
	debug("loadCaptchaImage() - started")
    sendDWRCallAsPost(function() { 
        userContext.establishSession(uiUpdater);
    });
}

function makeCaptchaImageUrl(seed) {
	return 'captcha?ts=' + (seed || (new Date().getTime() + Math.random()));
}

/**
 * This method can be used in two ways.
 * 1) 	Send in the name of the target in targetHolder. This will generate the picture in the holder and create a correct onError method directly.
 * 		The onError method will use the generatePlaceholder method to create a proper placeholder if the picture is missing.
 * 
 * 2) 	Send in null as targetHolder. This will return an url for the pic that you can use. You are then yourself responsible for creating a
 * 		proper onError method. The generatePlaceHolder method is recommended for this.
 */
function generateMediaPicture(targetHolder,section,id,size,index,extensionId) {
	// Create the padded mediaId
	var graphicLocator = convertSectionToPlaceholderValue(section);
	var mediaIdPadded = _getMediaIdPadded(id);
	var extensionName = generateMediaPictureExtension(extensionId);
		
	// Create the complete graphic url
	var graphicUrl;
	if(id != 0){
		graphicUrl = imageHome + graphicLocator + "/" + mediaIdPadded + "cover_" + size + "." + extensionName;
	}
	else {
		//items without id does not have image, load placeholder
		graphicUrl = generatePlaceholderUrl(graphicLocator, size);
	}
	if(targetHolder != "" && targetHolder != null)
	{
		// Generate a placeholder if the image is missing. The onError event is used since it's called when images are missing.
		if(id != 0){ 
			$("#"+targetHolder).error(function() {
				generatePlaceholder(targetHolder,graphicLocator,id,size,index);
			});
		}
		// Load the picture to the given destination
		$("#"+targetHolder).attr("src",graphicUrl);
	}
	return graphicUrl;
}

function generateLargeMediaPicture(targetHolder, pictureId, section, extensionId){
	var graphicLocator = convertSectionToPlaceholderValue(section);
	var tempId = section + '_large_img_' + pictureId;
	var imgHtml = new StringBuffer();
	imgHtml.append("<img id=\"");
	imgHtml.append(tempId);
	imgHtml.append("\"");
	imgHtml.append(" class=\"img_border\"");
	imgHtml.append(" alt=\"\" src=\"");
	imgHtml.append(generateMediaPicture("",section,pictureId,"170x170",0,extensionId));
	imgHtml.append("\" onerror=\"generatePlaceholder('");
	imgHtml.append(tempId);
	imgHtml.append("','");
	imgHtml.append(graphicLocator);
	imgHtml.append("','");
	imgHtml.append(pictureId);
	imgHtml.append("','170x170',0);\" width=\"170\" height=\"170\"/>");
	targetHolder.html(imgHtml.toString());
}


/*
 * Returns a padded media id, on the specific backoffice url format
 * Example: 
 *  - Input id = 1385823
 *  - Return value = "000/001/385/823/1385823_"
 */
function _getMediaIdPadded(id) {
	var mediaId = ""+id;
	
	while(mediaId.length < 12) mediaId = "0"+mediaId;
	var mediaIdPart1=mediaId.substr(0,3),
		mediaIdPart2=mediaId.substr(3,3),
		mediaIdPart3=mediaId.substr(6,3),
		mediaIdPart4=mediaId.substr(9,3),
		mediaIdPadded = mediaIdPart1+"/"+mediaIdPart2+"/"+mediaIdPart3+"/"+mediaIdPart4+"/"+id+"_";
	
	return mediaIdPadded;
}

	
function phoneImagesUrl(phonesUrl){
  	var phoneSelectorImgUrl = imageHome + "PHONE/";
  	return phoneSelectorImgUrl;	
}

function generateGamePreviewUrl(id,index,size,extensionId) {
	var mediaIdPadded = _getMediaIdPadded(id),
		extensionName = generateMediaPictureExtension(extensionId),
		graphicUrl = imageHome + "GAME/" + mediaIdPadded + "prev" + index + "_" + size + "." + extensionName;
	
	return graphicUrl;
}
function generateApplicationPreviewUrl(id,index,size,extensionId) {
	var mediaIdPadded = _getMediaIdPadded(id),
		extensionName = generateMediaPictureExtension(extensionId),
		graphicUrl = imageHome + "APP/" + mediaIdPadded + "prev" + index + "_" + size + "." + extensionName;
	
	return graphicUrl;
}
function generateThemePreviewUrl(id,index,size,extensionId) {
	var mediaIdPadded = _getMediaIdPadded(id),
		extensionName = generateMediaPictureExtension(extensionId),
		graphicUrl = imageHome + "THEME/" + mediaIdPadded + "prev" + index + "_" + size + "." + extensionName;
	
	return graphicUrl;
}

function generateMediaPictureExtension(extensionId) {
	var lookup = [null, "jpg","gif","png","jpg","gif","png"];	//starts with index 1
	
	return lookup[extensionId] || "jpg";
}

/**
 * Returns the image tag with an icon for the given content type
 */
function addIconTypeContent(mediaType) {
	var retValPart = "", _globals = globals;
	switch (mediaType) {
		case _globals.MediaType_SONG:
			retValPart = "music";
			break;
		case _globals.MediaType_GAME:
			retValPart = "games";
			break;
		case _globals.MediaType_APPLICATION:
			retValPart = "applications";
			break;
		case _globals.MediaType_RINGTONE:
			retValPart = "ringtones";
			break;
		case _globals.MediaType_WALLPAPER:
			retValPart = "wallpapers";
			break;
		case _globals.MediaType_THEME:
			retValPart = "themes";
			break;
		default:
			return "<img class='promolist_icon png' alt='' src='fe/images/blank.gif?'"+cacheControl+" width='28' height='27' />";
	}
	
	return "<div class='voucher_content_type_icon' id='voucher_content_type_icon_" + retValPart + "'>&nbsp;</div>";
	/*eturn ["<img class='promolist_icon png' alt='' src='fe/images/mediatypes/filter_", retVal, ".png' width='17' height='16' />"].join("");*/
}


/**
 * This method creates a proper placeholder in the <img> tag with id=[targetHolder]
 */
function generatePlaceholder(targetHolder, graphicLocator, mediaId, size, index) 
{
	if(graphicLocator.indexOf('section') != -1) var graphicLocator = convertSectionToPlaceholderValue(graphicLocator);
	var placeholderUrl = generatePlaceholderUrl(graphicLocator, size), node = $("#"+targetHolder);
	
	if(node.attr("src") != placeholderUrl) {
		node.attr("src", placeholderUrl);
	}	
}

/**
 * This method creates a proper placeholder in the <img> tag with id=[targetHolder]
 */
function generatePlaceholderUrl(graphicLocator, size) 
{
	return (placeholderHome + graphicLocator + "/" + size +".png");
}

function resetApplicationState() {
	resetApplicationStatePart1();
	resetApplicationStatePart2();
}

function logoutAccount() {
	resetApplicationStatePart1();
	userInfoHandler.logoutWeb(resetApplicationStatePart2); 
}

function resetApplicationStatePart1() {
	purchaseHistoryController.flushHistory();
	creditCardManager.flushCreditCards();
}

function resetApplicationStatePart2() {
	stateManager.flushHashMap();
	authentication.getAuthenticationStatus(true);
	Render.afterLoggedOut();
}

function initUser() {

	function myCallback(profile) {
		if (profile) {
			debug("initUser() - Got a profile. Will render logged in user. AuthenticationStatus: " + authentication.getAuthenticationStatus());
			Render.loggedIn(profile.firstName, profile.lastName, profile.phoneModel);
		} else {
			debug("initUser() - Did not get a profile. Will render logged out user. AuthenticationStatus: " + authentication.getAuthenticationStatus());
			Render.loggedOut();
		}
	}

	debug("initUser() - Started...");
	userInfoHandler.getCurrentUser(myCallback);
}

function Render() {}

/**
 * Called after application load, when the user is logged in,
 * and when a user logs in.
 */
Render.loggedIn = function(firstName, lastName, phoneModel) {
	deviceManager.updateDevice(phoneModel);
	deviceManager.updateDeviceContent();	
	userBoxHandler.renderUserBoxLoggedIn(firstName, lastName, phoneModel);
	trackIdAccordionController.renderMyTrackId();
	purchaseInboxController.renderInboxFigures();
	shoppingBasketController.renderCartFigures(true);
}	

/**
 * Called after application load, when the user is logged out.
 */
Render.loggedOut = function() {
	userBoxHandler.renderUserBoxLoggedOut();
	trackIdAccordionController.renderMyTrackId();
	purchaseInboxController.renderInboxFigures();
	shoppingBasketController.renderCartFigures(true);
}

/**
 * Called after a user has logged out.
 */
Render.afterLoggedOut = function() {
	userBoxHandler.renderUserBoxLoggedOut();
	loginController.setUI1Height();
	trackIdAccordionController.renderMyTrackId();
	tabBoxHandler.updateInbox(0);
}

function makeStandardHttpRequestParameters(viewName) {
	var standardParams = '?dn=' + stateManager.getPhoneModelName() +
		'&oc=' + currentOperatorCode + '&wcc=' + stateManager.getCountryCode() +
		'&wlc=' + stateManager.getLanguageCode();
	
	// Check for view that should bypass akamai cache
	if(typeof(viewName) != "undefined" && viewName != "") {
		for (var i=0; i<globals.VIEWS_NO_CACHE.length; i++) {
			var noCacheView = globals.VIEWS_NO_CACHE[i];
			if(noCacheView == viewName) {
				standardParams += '&cacheBypass=t';
				break;
			}
		}
	}
	
	return standardParams;
}

// Translates mediatype strings to
// proper lang; return null if
// anything is wacko
function translateMediaType(t){
	// got no globals - bail
	var _globals = globals || null;
	if(!_globals){ return null; }
	switch(t){
	 	case _globals.STR_MediaType_SONG:
	 	case _globals.STR_MediaType_RINGTONE:
	 	case _globals.STR_MediaType_GAME:
	 	case _globals.STR_MediaType_THEME:
	 	case _globals.STR_MediaType_WALLPAPER:
	 	case _globals.STR_MediaType_ALBUM:
	 		return i18n["web_mediatype_"+t.toLowerCase()];
	 	case _globals.STR_MediaType_APPLICATION:
	 		return i18n.web_mediatype_application;
	 	default:
	 		return null; 
	 }
}

// Translates mediatype strings to section
// return null if
// anything is wacko
function convertMediaTypeIdToSection(id){
	// got no globals - bail
	var _globals = globals || null;
	if(!_globals){ return null; }
	switch(id){
	 	case _globals.MediaType_SONG:
	 		return _globals.MUSIC_SECTION;
	 	case _globals.MediaType_RINGTONE:
	 		return _globals.RINGTONES_SECTION;
	 	case _globals.MediaType_GAME:
	 		return _globals.GAMES_SECTION;
	 	case _globals.MediaType_THEME:
	 		return _globals.THEMES_SECTION;
	 	case _globals.MediaType_WALLPAPER:
	 		return _globals.WALLPAPERS_SECTION;
	 	case _globals.MediaType_ALBUM:
	 		return _globals.MUSIC_SECTION;
	 	case _globals.MediaType_APPLICATION:
	 		return _globals.APPLICATIONS_SECTION;
	 	default:
	 		return null; 
	 }
}

// Translates mediatype strings to section
// return null if
// anything is wacko
function convertMediaTypeStrToSection(t){
	// got no globals - bail
	var _globals = globals || null;
	if(!_globals){ return null; }
	switch(t.toLowerCase()){
	 	case _globals.STR_MediaType_SONG.toLowerCase():
	 		return _globals.MUSIC_SECTION;
	 	case _globals.STR_MediaType_RINGTONE.toLowerCase():
	 		return _globals.RINGTONES_SECTION;
	 	case _globals.STR_MediaType_GAME.toLowerCase():
	 		return _globals.GAMES_SECTION;
	 	case _globals.STR_MediaType_THEME.toLowerCase():
	 		return _globals.THEMES_SECTION;
	 	case _globals.STR_MediaType_WALLPAPER.toLowerCase():
	 		return _globals.WALLPAPERS_SECTION;
	 	case _globals.STR_MediaType_ALBUM.toLowerCase():
	 		return _globals.MUSIC_SECTION;
	 	case _globals.STR_MediaType_APPLICATION.toLowerCase():
	 		return _globals.APPLICATIONS_SECTION;
	 	default:
	 		return null; 
	 }
}

// Translates mediatype strings to contenttype
// Only Songs and Apps are affected
function convertMediaTypeStrToContentType(t){
	// got no globals - bail
	var _globals = globals || null;
	if(!_globals){ return null; }
	switch(t){
	 	case _globals.STR_MediaType_SONG:
	 		return _globals.STR_ContentType_MUSIC;
	 	case _globals.STR_MediaType_APPLICATION:
	 		return _globals.STR_ContentType_APPLICATION;
	 	default:
	 		return t; 
	 }
}

function convertSectionToCode(section) {
	var _globals = globals;
	switch (section) {
		case _globals.MUSIC_SECTION :
			return _globals.MediaType_SONG;
		case _globals.GAMES_SECTION :
			return _globals.MediaType_GAME;
		case _globals.RINGTONES_SECTION :
			return _globals.MediaType_RINGTONE;
		case _globals.THEMES_SECTION :
			return _globals.MediaType_THEME;
		case _globals.WALLPAPERS_SECTION :
			return _globals.MediaType_WALLPAPER;
		case _globals.APPLICATIONS_SECTION :
			return _globals.MediaType_APPLICATION;
		default :
			return null;
	}
}

function convertPlaceholderValueToCode(placeholder) {
	var _globals = globals;
	switch (placeholder) {
		case "ALBUM" :
			return _globals.MediaType_SONG;
		case "GAME" :
			return _globals.MediaType_GAME;
		case "RINGTONE" :
			return _globals.MediaType_RINGTONE;
		case "THEME" :
			return _globals.MediaType_THEME;
		case "WALLPAPER" :
			return _globals.MediaType_WALLPAPER;
		case "APPLICATION" :
			return _globals.MediaType_APPLICATION;
		default :
			return null;
	}
}

function convertSectionToPlaceholderValue(section) {
	var _globals = globals;
	switch (section) {
	case _globals.MUSIC_SECTION:
		return "ALBUM";
	case _globals.GAMES_SECTION:
		return "GAME";
	case _globals.RINGTONES_SECTION:
		return "RINGTONE";
	case _globals.WALLPAPERS_SECTION:
		return "WALLPAPER";
	case _globals.THEMES_SECTION:
		return "THEME";
	case _globals.APPLICATIONS_SECTION:
		return "APP";
	default:
		debug("convertSectionToPlaceholderValue() - Why, why, why are you"
				+ " not calling me with a proper section value? Value: '"
				+ section + "'");
		return section;
	}
}

function convertMediaTypeIdToString(mediaTypeId) {
	var _globals = globals;
	switch ("" + mediaTypeId) {
	case "" + _globals.MediaType_SONG:
		return _globals.STR_MediaType_SONG;
	case "" + _globals.MediaType_GAME:
		return _globals.STR_MediaType_GAME;
	case "" + _globals.MediaType_RINGTONE:
		return _globals.STR_MediaType_RINGTONE;
	case "" + _globals.MediaType_WALLPAPER:
		return _globals.STR_MediaType_WALLPAPER;
	case "" + _globals.MediaType_THEME:
		return _globals.STR_MediaType_THEME;
	case "" + _globals.MediaType_APPLICATION:
		return _globals.STR_MediaType_APPLICATION;
	default:
		return _globals.STR_MediaType_SONG;
	}
}

function convertMediaTypeIdToLocalizedString(mediaTypeId) {
	var _globals = globals;
	switch (Number(mediaTypeId)) {
	case _globals.MediaType_SONG:
		return i18n.web_mediatype_song;
	case _globals.MediaType_GAME:
		return i18n.web_mediatype_game;
	case _globals.MediaType_RINGTONE:
		return i18n.web_mediatype_ringtone;
	case _globals.MediaType_WALLPAPER:
		return i18n.web_mediatype_wallpaper;
	case _globals.MediaType_THEME:
		return i18n.web_mediatype_theme;
	case _globals.MediaType_ALBUM:
		return i18n.web_mediatype_album;
	case _globals.MediaType_APPLICATION:
		return i18n.web_mediatype_application;
	case _globals.OfferType_MULTIPLE:
		return i18n.web_multiple_order;	
	default:
		return "";
	}
}

function convertMediaTypeIdToPurchaseHeader(mediaTypeId) {
	var _globals = globals;
	switch (Number(mediaTypeId)) {
	case _globals.MediaType_SONG:
		return i18n.web_purchase_buy_song;
	case _globals.MediaType_GAME:
		return i18n.web_purchase_buy_game;
	case _globals.MediaType_RINGTONE:
		return i18n.web_purchase_buy_ringtone;
	case _globals.MediaType_WALLPAPER:
		return i18n.web_purchase_buy_wallpaper;
	case _globals.MediaType_THEME:
		return i18n.web_purchase_buy_theme;
	case _globals.MediaType_ALBUM:
		return i18n.web_purchase_buy_album;
	case _globals.MediaType_APPLICATION:
		return i18n.web_purchase_buy_application;
	default:
		return "";
	}
}

function convertSectionToLocalizedHeader(section){
	if(!section){
		var section = stateManager.getView();
	}
	var _globals = globals;
	switch(section){
		case _globals.MUSIC_SECTION:	
			return i18n.web_General_categorymusic;
		case _globals.RINGTONES_SECTION: 
			return i18n.web_General_categoryringtones;
		case _globals.GAMES_SECTION: 
			return i18n.web_General_categorygames;
		case _globals.WALLPAPERS_SECTION:
			return i18n.web_General_categorywallpapers;
		case _globals.THEMES_SECTION: 
			return i18n.web_General_categorythemes;
		case _globals.APPLICATIONS_SECTION: 
			return i18n.web_General_categoryapplications;
	}	
}

// Send in your price -
// returns true if we think it's
// free
function isFree(myPrice){
	var ret = false;
	var freeAlt = [i18n.web_purchase_free,i18n.web_carousel_free,globals.FREE_ITEM];
	for(i=0; i<freeAlt.length; i++) { 
   			if(myPrice.indexOf(freeAlt[i]) != -1){
   				ret = true;
   				break; 
   			}
	}
	return ret;
}

/**
 * Returns country code from a specific locale
 * 
 * @param locale
 * @return country code
 */
function getCountryCodeByLocale(locale){
	if (!locale) {
		return null;
	}
	var sepIndex = locale.indexOf('_');
	if (sepIndex > 0) {
		return locale.substring(sepIndex+1);
	} else {
		return null;
	}
}

/**
 * Returns language code from a specific locale
 * 
 * @param locale
 * @return language code
 */
function getLanguageCodeByLocale(locale) {
	if (!locale) {
		return null;
	}
	var sepIndex = locale.indexOf('_');
	if (sepIndex > 0) {
		return locale.substring(0, sepIndex);
	} else {
		return null;
	}
}

/*
 * Gets the display price, if price exists.
 */
function getDisplayPrice(dataItem) {
	var displayPrice = "",
		priceAmount = dataItem.priceString;
	
	if (priceAmount == globals.PRICE_FREE) {
		displayPrice = i18n.web_purchase_free;
	} else if(priceAmount != null && priceAmount.length > 0) {
		priceAmount = parseFloat(priceAmount);
		priceAmount = priceAmount.toFixed(2);
		displayPrice = dataItem.priceCurrency + " " + priceAmount;
	}
	return displayPrice;
}

var javaCheck = {
	
	/**
	 * Returns true if a supported version of Java is installed.
	 */
	execute : function() {
		var success = false;
		if (!BrowserDetect.hasJavaEnabled) {
			// No Java at all
			stateManager.setPopupView("noJava");
			$("#noJavaPopupHeader").html(i18n.web_NoJava_enabled_title);
			$("#noJavaSubHeader").html(i18n.web_NoJava_enabled_subheader);
			$("#noJavaDescription").html(i18n.web_NoJava_enabled_description);
		} else if (BrowserDetect.javaIsBeta) {
			// A beta version is installed. We don't allow that.
			stateManager.setPopupView("noJava");
		} else {
			var javaVersionInstalled = BrowserDetect.javaVersion;
			if (this.compareVersions(javaVersionInstalled, javaMinimumVersionRequired) < 0) {
				// Wrong version of Java
				stateManager.setPopupView("noJava");
			} else {
				success = true;
			}
		}
		return success;
	},
	compareVersions: function(installedVersion, requiredVersion) {
		if (installedVersion == null || requiredVersion == null 
		 || installedVersion == "" || requiredVersion == "") {
			return -3;
		}
		
		var installedVersionSplit = installedVersion.split(/\.|,| |_/),
			requiredVersionSplit = requiredVersion.split(/\.|,| |_/);
	
		if (installedVersionSplit.length == 0 || requiredVersionSplit.length == 0) {
			return -3;
		}
		
		var versionSplitLength = installedVersionSplit.length,
			requiredVersionSplitLength  = requiredVersionSplit.length,
		
			installedMajor = versionSplitLength >= 0 ? installedVersionSplit[0] : 0,
			installedMinor = versionSplitLength >= 1 ? installedVersionSplit[1] : 0,
			installedSub   = versionSplitLength >= 2 ? installedVersionSplit[2] : 0,
	
			requiredMajor  = requiredVersionSplitLength  >= 0 ? requiredVersionSplit[0]  : 0,
			requiredMinor  = requiredVersionSplitLength  >= 1 ? requiredVersionSplit[1]  : 0,
			requiredSub    = requiredVersionSplitLength  >= 2 ? requiredVersionSplit[2]  : 0;
		
		if (installedMajor > requiredMajor || 
			installedMajor == requiredMajor && installedMinor > requiredMinor || 
			installedMajor == requiredMajor && installedMinor == requiredMinor && installedSub > requiredSub) {
			return 1;
		} else if (installedMajor < requiredMajor || 
			installedMajor == requiredMajor && installedMinor < requiredMinor || 
			installedMajor == requiredMajor && installedMinor == requiredMinor && installedSub < requiredSub) {
			return -1;
		} else {
			return 0;
		}
	}
}

// Detect if user have the required version of flash player installed
function detectFlashPlayer() 
{
    var flashInstalled = false;
    var detectFlash = PluginDetect.getVersion("Flash");
    if(detectFlash != null) {
    	var first = detectFlash.indexOf(',');
    	var majorVersion = detectFlash.substring(0,first); 
    	majorVersion = parseInt(majorVersion);
    	flashInstalled = (detectFlash == "null" || typeof(detectFlash) == "undefined" || majorVersion < 9) ? false : true;

    }
    
	if(!flashInstalled) {
		stateManager.setPopupView('noFlashPlayer');
	} 
}

function getCountryName(_countryCode) {
	var countryName = null;
	try {
		countryName = i18n["web_General_country_" + _countryCode];
	} catch (e) {
		debug("getCountryName() failed", e);
	}
	if (!countryName) {
		countryName = _countryCode;
	}
	return countryName;
}

function addToolTip(eventList, selector, id, longText) {
	eventList.mouseover(selector, EventHelper.showTooltip(id, longText));
}

/**
 * Helps to determine the correct search string to use for different fields of a search result.
 */
function SearchStringHelper(section, searchWord) {
	var me = this;
	// search string for title (song, game, etc)
	this.title = null;
	// search string for provider (artist or publisher)
	this.provider = null;
	// search string for album title
	this.album = null;

	function init() {
		var advSearchState = stateManager.getAdvancedSearchState();
		if (stateManager.getBrowserLayout() == stateManager.BrowseLayout_advancedSearchCovers
				|| stateManager.getBrowserLayout() == stateManager.BrowseLayout_advancedSearch) {
			if (section == globals.MUSIC_SECTION) { 
				me.title = advSearchState.musicSong;
				me.provider = advSearchState.musicArtist;
				me.album = advSearchState.musicAlbum;
			} else {
				me.title = advSearchState.otherTitle;
				me.provider = advSearchState.otherArtist;
				me.album = null;
			}
		} else {
			me.title = searchWord;
			me.provider = searchWord;
			me.album = searchWord;
		}
	}

	init();
}

/**
 * Helper function for retrieving and caching MediaShop data.
 */
function MediaShop() {
	var cache = new Object();
	
	this.get = function(_countryCode, clientCallback) {
		if (!_countryCode) {
			throw "no countryCode";
		}
		if (!clientCallback) {
			throw "no clientCallback";
		}
		
		fetchData(_countryCode, clientCallback);
	}
	
	this.getCustomerServicePhoneNumber = function(_countryCode, clientCallback) {
		if (!_countryCode) {
			throw "no countryCode";
		}
		if (!clientCallback) {
			throw "no clientCallback";
		}

		function myCallback(data) {
			if (data) {
				if (stateManager.getCountryCode() == "DE") {
					// If Germany, append customer service call rate
					clientCallback(data.customerServicePhoneNumber + " - " + i18n.web_customer_support_line_rate_info);
				} else {
					clientCallback(data.customerServicePhoneNumber);
				}
			} else {
				clientCallback(null);
			}
		}
		
		fetchData(stateManager.getCountryCode(), myCallback);
	}
	
	function fetchData(_countryCode, myCallback) {
		var cachedData = cache[_countryCode];
		
		if (cachedData) {
			debug("getCustomerServicePhoneNumber() - Found cached data...");
			myCallback(cachedData);
		} else {
			purchaseFlowService.getMediaShop( _countryCode, {
				async: true,
				timeout: 10000,
				errorHandler: function(data) { genericDWRError(data, "getCustomerServicePhoneNumber"); },
				callback: function(data) { cache[_countryCode] = data; myCallback(data); }
			});
		}
	}

}	

var mediaShop = new MediaShop();

 
function RegTracker() {
	this.submitToSession = function(regType) {
		sendDWRCallAsPost( function() { 
			userContext.setRegistrationType(regType, {
				async:true,
				callback: function(data) {
					if (data) {
						debug("RegTracker - submitted type to session")	
					} else {
						debug("RegTracker - failed to submit type to session")
					}
				}
			});
		 });		
	}
}
var regTracker = new RegTracker();
 

/**
 * Used to replace a hash key-value with another value.
 * @param replaceKey The key to change value for
 * @param replaceValue The new value
 * @param url The url to modify
 * @return result
 */
function URLHashRewrite(replaceKey, replaceValue, url) {
	url = url || window.location.href;
	replaceKey = replaceKey || null;
	replaceValue = replaceValue || null;
	if ( !replaceKey || !replaceValue ) {
		return url;
	}
	try {
		var newHash = url.split("#")[1],
			url = url.split("#")[0],
			regexp = new RegExp("(?:"+replaceKey+"=)[\\w\\d_]+", "i"),
			viewPart = newHash.match( regexp /*/(?:view=)[a-zA-Z_]+/*/)[0];
			
		viewParts = viewPart.split("=");
		viewParts[1] = replaceValue;
		newHash = newHash.replace(viewPart, viewParts.join("="));
	} catch ( e ) {
		debug("URLHashRewrite failed!" + e, null, LOGSEVERITY.WARNING);
		return url;
	}
	return url + "#" + newHash;
}

function StripQueryStringKey(keyToRemove, queryString) {
	queryString = queryString || window.location.search;
	keyToRemove = keyToRemove || null;
	var queryString, questionMarkIndex, stringBuffer, keyValues;
	if ( !keyToRemove ) {
		return url;
	}
	try {
		if ( queryString.indexOf('?') !== -1 ) {
			queryString = queryString.substring(1);
		}
		stringBuffer = [];
		keyValues = queryString.split("&");
		
		for ( var i = 0, n = keyValues.length; i < n; ++i ) {
			var pair = keyValues[i].split("=");
			if ( pair.length == 2 && pair[0] !== keyToRemove ) {
				stringBuffer.push( keyValues[i] );
			}
		}
		
		queryString = stringBuffer.join("&");
	} catch ( e ) {
		debug("URLSearchRewrite failed!" + e, null, LOGSEVERITY.WARNING);
		return url;
	}
	
	return queryString;
}


/**
 * Bind args to a func. good if you wanna set your own
 * onclick events with arguments to a function like
 * 
 * myBut.onclick = BindArguments(myNiftyFunction, "apa", "bepa");
 *
 */
function BindArguments(fn){
  var args = [];
  for (var n = 1; n < arguments.length; n++)
    args.push(arguments[n]);
  return function () { return fn.apply(this, args); };
}

function FormattedMediaItem(itemData, provider, providerId, album, albumId){
	//debug('FormattedMediaItem',itemData);
	this.mediaId = itemData.id;
	this.title = itemData.title;
	this.provider = provider;
	this.providerId = providerId;
	this.albumId = albumId;
	this.album = album;
	this.explicit = itemData.explicit;
	this.purchasable = itemData.purchasable;
	this.priceString = itemData.priceString;
	this.priceCurrency = itemData.priceCurrency;
	this.priceCurrencyName = itemData.priceCurrencyName;
	this.displayPrice = getDisplayPrice(itemData);
	this.isFreeItem = itemData.free;
	this.extensionId = itemData.artExtensionSetId;
	this.vatPercentage = itemData.vatPercentage;
	this.vatIncluded = itemData.vatIncluded;
	this.mediaTypeId = itemData.mediaTypeId;
	this.hasPreview = itemData.hasPreview;
	this.albumOnly = itemData.purchasableViaAlbumOnly;
	this.isFormatted = true;
	
	this.toString=function(){
		return "[object formatted mediaitem]";
	}
}

function formatMediaItemForBasketAndPreview(itemData, section){
	var provider, providerId, album, 
		albumId = itemData.id;
	
	//debug("itemData in formatMedia.." , itemData);
	if (section == globals.MUSIC_SECTION) {
		provider = itemData.encodedArtist;
		providerId = itemData.artistId;
		if(itemData.mediaTypeId == globals.MediaType_SONG){
			albumId = itemData.songMedia.albumId;
			album = itemData.songMedia.encodedAlbum;
		} else {
			album = itemData.encodedTitle;
		}
	} else {
		if (section == globals.RINGTONES_SECTION) {
			provider = itemData.encodedArtist;
		} else {
			provider = itemData.encodedProvider;
		}
		providerId = itemData.providerId;
	}
	return new FormattedMediaItem(itemData, provider, providerId, album, albumId);
}


///////////////////////////////////////////////////////////////////////////////////
// DO NOT remove the next newline and DO NOT add code after this comment.
 