var userAgent = navigator.userAgent.toLowerCase();
var isMSIE = (userAgent.indexOf("msie")!= -1);
var isSafari = (userAgent.indexOf("safari")!= -1);
var IEversion;

////////////////////////////////////////////////////////////////////////////
// PLAYER
////////////////////////////////////////////////////////////////////////////

var httpStr = 'https';
var clientInfo;
document.write("<OBJECT classid=clsid:A9FC132B-096D-460B-B7D5-1DB0FAE0C062 height=0 id=predeliverObj width=0></OBJECT>");

function upgrade(){
    document.getElementById("wmpError").innerHTML = "Your media player software is too old to use with this shop. Please upgrade your Windows Media Player components by clicking <a href=\"javascript:void(window.open('http://drmlicense.one.microsoft.com/Indivsite/en/indivit.asp?force=1',null,'width=500,height=550,scrollbars=1'));\"><u>here</u></a>";
    document.getElementById("wmpError").style.display = 'block';  
    document.getElementById("cart").style.top = 255 + "px";  
    document.getElementById("cartContent").style.top = 295 + "px";
}

function changeBrowser(){
    document.getElementById("wmpError").innerHTML = "We recommend for your own convenience that you use Internet Explorer 6.0 or later";
    document.getElementById("wmpError").style.display = 'block';    
    document.getElementById("cart").style.top = 255 + "px";  
    document.getElementById("cartContent").style.top = 295 + "px";
}

function checkWMP(){
    if (isMSIE) {
        var security = clientInfo.toLowerCase();
        if(security.indexOf("<securityversion>") > -1){
            var _start = security.indexOf("<securityversion>")+17;
            var _end = security.indexOf("</securityversion>");
            var security = security.substring(_start,_end);
            var versions = security.split(".");
            if(versions[0] < 2 || versions[1] < 4){
                upgrade();        
            }
        } else {
            upgrade();        
        }
    } else {
        changeBrowser();
    }
}

if (isMSIE) {
    document.write("<object id=player type='application/x-oleobject' classid='clsid:22D6F312-B0F6-11D0-94AB-0080C74C7E95' codebase='"+httpStr+"://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701' style='display:none'></object>");
    clientInfo = document.getElementById("predeliverObj").GetSystemInfo();

/*
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null){
        IEversion = parseFloat( RegExp.$1 );
        if(IEversion < 7){
            document.getElementById("cart").style.top = 245 + "px";  
            document.getElementById("cartContent").style.top = 250 + "px" //295 + "px";
        }
    }
*/



} else {
    document.write('<div id="embedPlayerDiv" style="height:0;"></div>');
}


Player = function() {
	this.curVolProcent = 4;
	this.trackSite = "/samples/";
	this.currentPlayingSample;
};

Player.prototype = {
    
    "stop": function (data) {
		if(isMSIE) {
			document.getElementById('player').Stop();
		} else {
			document.getElementById('embedPlayerDiv').innerHTML = '';
		}
	},

	"playTrack": function (trackFile) {
		if (isMSIE) {
			document.getElementById('player').FileName = this.trackSite + trackFile;
		} else {
			document.getElementById('embedPlayerDiv').innerHTML = "<embed id='embedPlayer' src='" + this.trackSite + trackFile+"' type='application/x-mplayer2' pluginspage='"+httpStr+"://www.microsoft.com/isapi/redir.dll?prd=windows&sbp=mediaplayer&ar=Media&sba=Plugin&' width=0 height=0></embed>";
		}
	},

	"playCurrentTrack": function () {
		this.playTrack(this.currentPlayingSample);
	},

	"playTrackInPlayer": function (trackFile, artist, title) {
		this.currentPlayingSample = trackFile;
		this.playTrack(trackFile);
        document.getElementById("playerName").innerHTML = format.name(title, playerNameLength);	
		document.getElementById("playerArtist").innerHTML = format.name(artist, playerArtistLength);
	},
	
	"openPopupPlayer": function(sampleURL){
	   var url = window.location + "";
	   var portalURL;
	   var urlFragments = url.split("/");
	   for(var i=urlFragments.length; i>0;i--){
	       if(urlFragments[i-1] != "" && typeof urlFragments[i-1] !="undefined" && urlFragments[i-1] != "index.html"){ 
	           portalURL = urlFragments[i-1];
                break;
	       }
	   }
	   var new_window = window.open("../player.html?" + portalURL + "&" + sampleURL, null ,"width=400,height=300,scrollbars=0");
	   new_window.focus();
	}

	
};

var player = new Player();


////////////////////////////////////////////////////////////////////////////
// ContentManager
////////////////////////////////////////////////////////////////////////////

var trackPresentation;
var albumPresentation;
var childPresentation;
var videoPresentation;
var moviePresentation;
var listPresentations;
var focusedMoviePresentation;
var focusedTrackPresentation;
var focusedAlbumPresentation;
var focusedVideoPresentation;
var allProducts = new Array();

ContentManager = function() {
    this.DA_ALL_URL = serverName + portalName + "/products.json";
    this.DA_LISTS_URL = serverName + portalName + "/lists.json";
    this.contentContainer = null;
}

ContentManager.prototype = {

	"initialize": function () {
	    var formatter = new Format();
        if(document.getElementById("focused_movie")) {
            focusedMoviePresentation = formatter.presentation(document.getElementById("focused_movie").innerHTML);
            document.getElementById("focused_movie").innerHTML = "";
        }
        if(document.getElementById("focused_track")) {
            focusedTrackPresentation = formatter.presentation(document.getElementById("focused_track").innerHTML);
            document.getElementById("focused_track").innerHTML = "";
        }
        if(document.getElementById("focused_album")) {
            focusedAlbumPresentation = formatter.presentation(document.getElementById("focused_album").innerHTML);
            document.getElementById("focused_album").innerHTML = "";
        }
        if(document.getElementById("focused_video")) {
            focusedVideoPresentation = formatter.presentation(document.getElementById("focused_video").innerHTML);
            document.getElementById("focused_video").innerHTML = "";
        }	    
	    if(document.getElementById("lists") != null){
	       listPresentations = new Array();
	       for(var i=0; i<productLists.length; i++){
	           listPresentations[productLists[i]] = new Array();
	           if(document.getElementById(productLists[i] + "_tracks") != null){
	               listPresentations[productLists[i]]["track"] = formatter.presentation(document.getElementById(productLists[i] + "_tracks").innerHTML);
	               document.getElementById(productLists[i] + "_tracks").innerHTML = "";
	           }
	           if(document.getElementById(productLists[i] + "_children") != null){
	               listPresentations[productLists[i]]["child"] = formatter.presentation(document.getElementById(productLists[i] + "_children").innerHTML);
	               document.getElementById(productLists[i] + "_children").innerHTML = "theChildrenOfTheListAlbum";
	           }
	           if(document.getElementById(productLists[i] + "_albums") != null){
	               listPresentations[productLists[i]]["album"] = formatter.presentation(document.getElementById(productLists[i] + "_albums").innerHTML);
	               document.getElementById(productLists[i] + "_albums").innerHTML = "";
	           }
	           if(document.getElementById(productLists[i] + "_movies") != null){
	               listPresentations[productLists[i]]["movie"] = formatter.presentation(document.getElementById(productLists[i] + "_movies").innerHTML);
	               document.getElementById(productLists[i] + "_movies").innerHTML = "";
	           }
	           if(document.getElementById(productLists[i] + "_videos") != null){
	               listPresentations[productLists[i]]["video"] = formatter.presentation(document.getElementById(productLists[i] + "_videos").innerHTML);
	               document.getElementById(productLists[i] + "_videos").innerHTML = "";
	           }
	       }
	       document.getElementById("lists").style.display = 'none';
	       this.fetchLists();
	    } else {
	       if(document.getElementById("children") != null){
	           childPresentation = formatter.presentation(document.getElementById("children").innerHTML);
	           document.getElementById("children").innerHTML = "theChildrenOfTheAlbum";
	       }
	       if(document.getElementById("albums") != null){
	           albumPresentation = formatter.presentation(document.getElementById("albums").innerHTML);
	           document.getElementById("albums").innerHTML = "";
	       }
	       if(document.getElementById("tracks") != null) {
	           trackPresentation = formatter.presentation(document.getElementById("tracks").innerHTML);
	           document.getElementById("tracks").innerHTML = "";
	       }
	       if(document.getElementById("videos") != null) {
	           videoPresentation = formatter.presentation(document.getElementById("videos").innerHTML);
	           document.getElementById("videos").innerHTML = "";
	       }
	       if(document.getElementById("movies") != null) {
	           moviePresentation = formatter.presentation(document.getElementById("movies").innerHTML);
	           document.getElementById("movies").innerHTML = "";
	       }
	       this.fetchAllProducts();
	   }
	   
	},
	        
    "fetchLists": function () {
        var d = loadJSONDoc(contentManager.DA_LISTS_URL);
        //var d = loadJSONDoc("lists.json");
        d.addCallbacks(contentManager.insertListsHTML,contentManager.contentFailed);    
    },
        
    "fetchAllProducts": function () {
        var d = loadJSONDoc(contentManager.DA_ALL_URL);
        d.addCallbacks(contentManager.insertAllProductsHTML,contentManager.contentFailed);
    },
	
    "contentFailed": function (err) {
	   //alert(strConnectionFailed);
    },

	"insertAllProductsHTML": function (data) {
	    allProducts = data;
	    var formatter = new Format();
		var finalPresentation = "";
		if(allProducts.length > 0) {
			var singlePresentation;
			for(var i=0;i<allProducts.length;i++){
				if(allProducts[i].entityType == "Track") {
					finalPresentation = finalPresentation + formatter.product(trackPresentation, allProducts[i], "track");
				} else if(allProducts[i].entityType == "MusicCollection") {
				    finalPresentation = finalPresentation + formatter.product(albumPresentation, allProducts[i], "album");
					var childPresentations = "";
					for(var j=0;j<allProducts[i].collectedProducts.length;j++){
					   childPresentations = childPresentations + formatter.product(childPresentation, allProducts[i].collectedProducts[j], "child");
					}
					if(allProducts[i].collectedProducts.length > 0){
					   finalPresentation = finalPresentation.replace("theChildrenOfTheAlbum", childPresentations)
					} else {
					   finalPresentation = finalPresentation.replace("theChildrenOfTheAlbum", "")
					}
				}
			}	
		}
        document.getElementById("products").innerHTML = finalPresentation;
        document.getElementById("products").style.display = 'block';
        document.getElementById("productsLoader").style.display = 'none';
        contentManager.openState();
	},

	"insertListsHTML": function (lists) {
	   for(var k=0; k<lists.length; k++){
	       for(var j=0; j<lists[k].products.length; j++){
	           allProducts[allProducts.length] = lists[k].products[j];
	       }
	   }
	   var formatter = new Format();
	   for(var i=0; i<productLists.length; i++){
	       var list;
	       for(var k=0; k<lists.length; k++){
	           if(lists[k].name == productLists[i]){
	               list = lists[k];
	               break;
	           }
	       }
	       if(list != null){
	           var finalPresentation = "";
	           for(var j=0;j<list.products.length;j++){
	               if(list.products[j].entityType == "Track") {
	                   finalPresentation = finalPresentation + formatter.product(listPresentations[productLists[i]]["track"],list.products[j], "track");
	               } else if(list.products[j].entityType == "MusicCollection") {
	                   finalPresentation = finalPresentation + formatter.product(listPresentations[productLists[i]]["album"],list.products[j], "album");
	                   var childPresentations = "";
	                   for(var v=0;v<list.products[j].collectedProducts.length;v++){
	                       childPresentations = childPresentations + formatter.product(listPresentations[productLists[i]]["child"],list.products[j].collectedProducts[v], "child");
	                   }
	                   if(list.products[j].collectedProducts.length > 0){
	                       finalPresentation = finalPresentation.replace("theChildrenOfTheListAlbum", childPresentations)
	                   } else {
	                       finalPresentation = finalPresentation.replace("theChildrenOfTheListAlbum", "")
	                   }
	               } else if(list.products[j].entityType == "Movie") {
	                   finalPresentation = finalPresentation + formatter.product(listPresentations[productLists[i]]["movie"],list.products[j], "movie");
	               } else if(list.products[j].entityType == "MusicVideo") {
	                   finalPresentation = finalPresentation + formatter.product(listPresentations[productLists[i]]["video"],list.products[j], "video");
	               }
	           }
	       }
	       document.getElementById(productLists[i]).innerHTML = finalPresentation;
	   }
	   document.getElementById("lists").style.display = 'block';
	   document.getElementById("productsLoader").style.display = 'none';
	   insertStars();
	   contentManager.openState();
	},
	
	"openState": function(){
		var query = testUser.length > 0 && testToken.length > 0 ? "action=redownload&user=" + testUser + "&token=" + testToken: window.location.search;
		 if(query.length > 0){
            var actionIndex = query.indexOf("action=");
            if(actionIndex != -1){
                var action = query.substring(actionIndex+7, query.indexOf("&") != -1 ? query.indexOf("&") : query.length);
                if(action == "redownload"){
                    contentManager.forceSecureConnection();
                    var userIndex = query.indexOf("user=");
                    var tokenIndex = query.indexOf("token=");
                    if(userIndex != -1 && tokenIndex != -1){
                        var user = query.substring(userIndex+5, query.length);
                        var token = query.substring(tokenIndex+6, query.length);
                        if(user.indexOf("&") != -1){
                            user = user.substring(0,user.indexOf("&"));
                        } 
                        if(token.indexOf("&") != -1){
                            token = token.substring(0,token.indexOf("&"));
                        }
                        redownload.showAssetChooser(user, token);
                    }
                } else if(action == "payment") {
                    contentManager.forceSecureConnection();
                    cashier.showPayment();
                }
            }
        }	
	},
	
	"focusProduct": function(id){
	   for(var i=0; i<allProducts.length; i++){
	       if(allProducts[i].id == id){
	           var container;
	           var wrapper;
	           var entityType = allProducts[i].entityType;
	           if(entityType == "MusicCollection"){
	               entityType = "album";
	               container = focusedAlbumPresentation
	               wrapper = document.getElementById("focused_album");
	           } else if(entityType == "Track"){
	               entityType = "track";
	               container = focusedTrackPresentation
	               wrapper = document.getElementById("focused_track");
	           } else if(entityType == "Movie"){
	               entityType = "movie";
	               container = focusedMoviePresentation;
	               wrapper = document.getElementById("focused_movie");
	           }
	           var formatter = new Format();
	           wrapper.innerHTML = formatter.product(container,allProducts[i], entityType);
	           document.getElementById("disableShopLayer").style.visibility = 'visible';
	           document.getElementById("disableShopLayer").style.height = (document.documentElement.scrollHeight > document.body.scrollHeight ? document.documentElement.scrollHeight : document.body.scrollHeight) + "px";
	           document.getElementById("disableShopLayer").style.width = document.body.scrollWidth + "px";
	           wrapper.style.display = "block";
	           break;
	       }
	   }
	},
	
	"unFocusProduct": function(){
        if(document.getElementById("focused_movie")) {
            document.getElementById("focused_movie").style.display = "none";
        }
        if(document.getElementById("focused_track")) {
            document.getElementById("focused_track").style.display = "none";
        }
        if(document.getElementById("focused_album")) {
            document.getElementById("focused_album").style.display = "none";
        }	    
        document.getElementById("disableShopLayer").style.height = "0px";
        document.getElementById("disableShopLayer").style.visibility = 'hidden';
  	},	
	
	"forceSecureConnection": function(){
	   var url = window.location + "";
	   if(development == false && url.indexOf("https") != 0){
	       window.location = "https" + url.substring(4,url.length);
	   }
    }
    	
}

var contentManager = new ContentManager();

////////////////////////////////////////////////////////////////////////////
// Cart.js
////////////////////////////////////////////////////////////////////////////

var cartStatusPresentation = "";
var itemPresentation = "";
var items = [];

Cart = function() {
    this.DA_ADD_URL = serverName + portalName + "/cart.json?newItem=";
    this.DA_REMOVE_URL = serverName + portalName + "/cart.json?droppedItem=";
    this.DA_STATUS_URL = serverName + portalName + "/cart.json";
    this.contentContainer = null;
	this.contentContainerSizes = new Array(cartContentWidth,0,cartContentWidth,cartContentMinHeight); // [startWidth, startHeight, endWidth, endHeight]
	this.animationSteps = 10;
	this.animationRate = 50;
	this.disabledActions = true;
}

Cart.prototype = {
    
    "initialize": function (){
	    itemPresentation = document.getElementById("cartItems").innerHTML;
	    cartStatusPresentation = document.getElementById("cartStatus").innerHTML;
        this.contentContainer = document.getElementById("cartContent");
	    this.status();
    },
    
	"numberOfItems": function () {
		return this.items.length; 
    },
        
	"disableCartActions": function(){
		this.disabledActions = true;
	},

    "totalAmount": function () {
        var amount = Number(0);
		for(var i=0; i<items.length; i++){
			amount = amount + Number(items[i].price);
		}
		return amount;    
    },

    "updateRecieved": function (data) {
        var formatter = new Format();
        var productsLoaded = true;
        items = data;
        var newCartStatus = cartStatusPresentation;
        var cartActions;
        var amount = Number(0);
        for(var i=0; i<items.length; i++){
            amount = amount + Number(items[i].price);
        }
        newCartStatus = newCartStatus.replace("cart.totalAmount", formatter.price(amount));
        newCartStatus = newCartStatus.replace("cart.itemsCount",  items.length);
        if(items.length == 0 ){
            newCartStatus = newCartStatus.replace("cart.itemLabel",  strItems);
            cartActions =  "<img src=\"" + imgShowCartDisabled + "\" /><img src=\"" + imgCheckoutDisabled + "\" />";
            document.getElementById("cartContent").style.visibility = 'hidden'
        } else if(items.length == 1){
            newCartStatus = newCartStatus.replace("cart.itemLabel", strItem);
            cartActions =  "<a href=\"javascript:cart.toggleContentShowing()\"><img src=\"" + imgShowCart + "\" /></a><a href=\"javascript:cart.buyContent()\"><img src=\"" + imgCheckout + "\" /></a>";
        } else {
            newCartStatus = newCartStatus.replace("cart.itemLabel",  strItems);
            cartActions =  "<a href=\"javascript:cart.toggleContentShowing()\"><img src=\"" + imgShowCart + "\" /></a><a href=\"javascript:cart.buyContent()\"><img src=\"" + imgCheckout + "\" /></a>";
        }
        document.getElementById("cartActions").innerHTML = cartActions;
        document.getElementById("cartStatus").innerHTML = newCartStatus;
        document.getElementById("cart").style.display = 'block';        
        var finalPresentation = "";
        if(items.length > 0) {
            var singlePresentation;
            for(var i=0;i<items.length;i++){
                finalPresentation = finalPresentation + formatter.cartItem(itemPresentation, items[i]);
            }
        }
        document.getElementById("cartItems").innerHTML = finalPresentation;
    },
    
    "contentHTML": function (){
        var formatter = new Format();
		var finalPresentation = "";
		if(items.length > 0) {
			var singlePresentation;
			for(var i=0;i<items.length;i++){
        		finalPresentation = finalPresentation + formatter.cartItem(itemPresentation, items[i]);
        	}	
		}
        document.getElementById("cartItems").innerHTML = finalPresentation;
    },

    "updateFailed": function (err) {
		//alert(strConnectionFailed);		
    },

    "status": function () {
        //var str = new Date().getUTCMilliseconds();
        var str = Math.random()*3;
        var d = loadJSONDoc(cart.DA_STATUS_URL + "?random=" + str);
		d.addCallbacks(this.updateRecieved,this.updateFailed);
    },
        
    "add": function (e, node, id) {
		var element = document.getElementById("notice_" + id);
		if(element != null){
		  element.style.display = 'block';
		}
		var element2 = document.getElementById("notice2_" + id);
		if(element2 != null){
		  element2.style.display = 'block';
		}
        document.getElementById("cartContent").style.visibility = 'hidden'
        var d = loadJSONDoc(this.DA_ADD_URL + id);
		d.addCallbacks(this.updateRecieved,this.updateFailed);
    },
    
    "hideNotification": function (){
	   var element = document.getElementById("notification");
	   element.style.display = "none";
    },
	
    "remove": function (id) {
        var d = loadJSONDoc(this.DA_REMOVE_URL + id);
		d.addCallbacks(this.updateRecieved,this.updateFailed);
		var element = document.getElementById("notice_" + id);
		if(element != null){
		      element.style.display = 'none';
        }
		var element2 = document.getElementById("notice2_" + id);
		if(element2 != null){
		    element2.style.display = 'none';
		}
    },
	
	"toggleContentShowing": function () {
        var contentContainer = document.getElementById("cartContent");
		if(	contentContainer.style.visibility == 'visible' ){
			document.getElementById("cartItems").innerHTML = "";
			cart.animateShowingCart(1,this.contentContainerSizes[2],Number(contentContainer.style.height.substring(0,contentContainer.style.height.length - 2)),this.contentContainerSizes[0],this.contentContainerSizes[1]);
		} else {
            contentContainer.style.visibility = 'visible';
			document.getElementById("cartItems").innerHTML = "";
			contentContainer.style.visibility = 'visible';
			cart.animateShowingCart(1,this.contentContainerSizes[0],this.contentContainerSizes[1],this.contentContainerSizes[2],this.contentContainerSizes[3] +             
(items.length*cartContentItemHeight));
		}
	},
	
	"animateShowingCart": function (step, startWidth, startHeight, endWidth, endHeight) {
		if(cart.animationSteps > step) {
			var contentContainer = document.getElementById("cartContent");
			contentContainer.style.width = Math.round((((Number(endWidth) - startWidth) / Number(cart.animationSteps)) * Number(step)) + Number(startWidth)) + "px";
			contentContainer.style.height = Math.round((((Number(endHeight) - startHeight) / Number(cart.animationSteps)) * Number(step)) + Number(startHeight)) + "px";
			step = step + 1;
			setTimeout( "cart.animateShowingCart(" + step + "," + startWidth + "," + startHeight + "," + endWidth + "," + endHeight + ")", cart.animationRate);
        } else {
			var contentContainer = document.getElementById("cartContent");
			contentContainer.style.width  = endWidth + "px";
            contentContainer.style.height  = endHeight + "px";
			if(	endHeight > 0) {
				cart.contentHTML();
			} else {
				contentContainer.style.visibility = 'hidden';
			}
		}
	},
	
	"buyContent": function(){
	   var url = window.location + "";
	   if(development){
	   	   cashier.showPayment();
	   } else {
	       //window.location = (url.indexOf("https") == -1 ? "https" + url.substring(4,url.length) : url ) + "?action=payment";
	       url = url.replace("http://", "https://");
	       url = url.substring(0,url.lastIndexOf("/")) + "/index.html?action=payment";
	       window.location = url;
	   }
    }
    
}
var cart = new Cart();

////////////////////////////////////////////////////////////////////////////
// Cashier
////////////////////////////////////////////////////////////////////////////
var fees = [];
var paymentMethods = new Array();
var totalCredit = 0;
var basePrice = 0;
var _invoiceHTML = "_";
var encodedAssetPresentation;
var receiptPresentation;
var lineItemPresentation;
var usedGiftCertificatePresentation;

Cashier = function(){
    this.PAYMENTMETHODS_URL = serverName + portalName + "/paymentMethods.json";
    this.ADD_PAYMENTMETHOD_URL = serverName + portalName + "/paymentCertificates.json";
    this.INVOICE_URL = serverName + portalName + "/invoice.json?user=";
    this.ASSET_URL = serverName + portalName + "/assets.json";
    this.ZIP_URL = serverName + portalName + "/zipper.json"
}

Cashier.prototype = {

    "initialize": function(){
        var formatter = new Format();
        encodedAssetPresentation = formatter.presentation(document.getElementById("encodedAssets").innerHTML);
        lineItemPresentation = formatter.presentation(document.getElementById("lineItems").innerHTML);
        document.getElementById("lineItems").innerHTML = "lineItemsOfTheReceipt";
        if(document.getElementById("giftCertificatesIsUsed") != null){
            usedGiftCertificatePresentation = formatter.presentation(document.getElementById("usedGiftcertificates").innerHTML);
            document.getElementById("usedGiftcertificates").innerHTML = "usedGiftcertificatesOfTheReceipt";
        }
        receiptPresentation = formatter.presentation(document.getElementById("receiptWrapper").innerHTML);        
    },    
    
    "showPayment": function(){
        this.errorClear();
		cashier.getPaymentMethods();
        document.getElementById("disableShopLayer").style.visibility = 'visible';
        document.getElementById("disableShopLayer").style.height = (document.documentElement.scrollHeight > document.body.scrollHeight ? document.documentElement.scrollHeight : document.body.scrollHeight) + "px";
        document.getElementById("disableShopLayer").style.width = document.body.scrollWidth + "px";        
        document.getElementById("checkoutWrapper").style.visibility = 'visible';
        document.getElementById("payment").style.display = "block";
        document.getElementById("download").style.display = "none";
        document.getElementById("assetChooser").style.display = "none";
        if(cart.totalAmount() == 0){
            setTimeout("cashier.showPayment()", 500);
        } else {
            basePrice = cart.totalAmount();        
            document.getElementById("invoiceCartTotal").innerHTML = format.price(basePrice);
            this.setFeeUserInfo(0);
        }
	},
    
    "changePaymentForm" : function(code){
        this.errorClear();
        document.getElementById("CreditCardPayment").style.display = "";
        document.getElementById("NetBankingPayment").style.display = "";
        document.getElementById("CertificatePayment").style.display = "";
        if(code == -1){
            document.getElementById("paymentSwitcher").selectedIndex = 0;
            this.setFeeUserInfo(0);
        } else {        
            for(var i=0;i<paymentMethods.length;i++){
                if(code == paymentMethods[i][0]){
                    document.getElementById(paymentMethods[i][1]).style.display = "block";
                }
            }
            this.setFeeUserInfo(code);
        }
    },
    
    "getPaymentMethods": function () {
        cashier.loading(true);
        var d = loadJSONDoc(this.PAYMENTMETHODS_URL);
		d.addCallbacks(this.paymentMethodsReceived,this.paymentMethodsReceivingFailed);
    },
    
    "paymentMethodsReceived": function(methods){
        cashier.errorClear();
        var _creditcards = new Array();
        var _webPayments = new Array();
        var _netbanks = new Array();
        var _certificates = new Array();
        var possibleCreditcards = new Array("DK","V-DK", "VISA", "MC", "JCB", "ELEC", "DIN(DK)", "MTRO(DK)", "MC(DK)", "AMEX");
        var possibleNetbanks = new Array("SOLO","DNB","BG");
        var possiblePaymentServices = new Array("ew");
        var possibleCertificates = new Array("PFGC");

        fees = new Array(methods.length);
        for(var i=0;i<methods.length;i++){
            fees[i] = new Array(5);
            fees[i]['minimum'] = methods[i].feeMinimum;
            fees[i]['percent'] = methods[i].feePercent;
            fees[i]['fee'] = methods[i].fee;
            fees[i]['code'] = methods[i].code;
            for(var j=0; j<possibleCreditcards.length; j++){
                if(possibleCreditcards[j] == methods[i].code){
                    paymentMethods[paymentMethods.length] = new Array(methods[i].code, "CreditCardPayment");
                    _creditcards[_creditcards.length] = methods[i];
                }
            }
            for(var k=0; k<possibleNetbanks.length; k++){
                if(possibleNetbanks[k] == methods[i].code){
                    paymentMethods[paymentMethods.length] = new Array(methods[i].code, "NetBankingPayment");
                    _netbanks[_netbanks.length] = methods[i];
                }
            }
            for(var v=0; v<possiblePaymentServices.length; v++){
                if(possiblePaymentServices[v] == methods[i].code){
                    paymentMethods[paymentMethods.length] = new Array(methods[i].code, "NetBankingPayment");
                    _webPayments[_webPayments.length] = methods[i];
                }
            }
            for(var v=0; v<possibleCertificates.length; v++){
                if(possibleCertificates[v] == methods[i].code){
                    paymentMethods[paymentMethods.length] = new Array(methods[i].code, "CertificatePayment");
                    _certificates[_certificates.length] = methods[i];
               }
            }
        }        
        var select = document.getElementById("paymentSwitcher");
        var formatter = new Format();
        var optionIndex = 2;
        select.options[0] = new Option(strChoosePayment, -1);        
        select.options[1] = new Option("", -1);
        
        if(_certificates.length > 0) {
            var certififactRowInInvoice = document.getElementById("invoiceCertificateRow");
            if(certififactRowInInvoice != null){
                certififactRowInInvoice.style.display = "block";
            }
            select.options[optionIndex] = new Option("----- " + strGiftCertificates + " -----", -1);
            optionIndex++;
            for(var w=0; w<_certificates.length; w++){
                select.options[optionIndex] = new Option(strGiftCertificate + " (+ " + formatter.price(cashier.calculateFee(_certificates[w].code)) + " " + strCurrency + ")", _certificates[w].code);
                optionIndex++;
            }
            select.options[optionIndex] = new Option("", -1);
            optionIndex++;            
        } else {
            document.getElementById("invoiceCertificateRow").style.display = "none";
        }
        
        if(_creditcards.length > 0) {
            select.options[optionIndex] = new Option("----- " + strCreditcards + " -----", -1);
            optionIndex++;
            for(var q=0; q<_creditcards.length; q++){
                select.options[optionIndex] = new Option(_creditcards[q].name + " (+ " + formatter.price(cashier.calculateFee(_creditcards[q].code)) + " " + strCurrency + ")", _creditcards[q].code);
                optionIndex++;
            }
            
            select.options[optionIndex] = new Option("", -1);
            optionIndex++;            
        }
        if(_netbanks.length > 0) {
            select.options[optionIndex] = new Option("----- " + strNetbanks + " -----", -1);
            optionIndex++;
            for(var p=0; p<_netbanks.length; p++){
                select.options[optionIndex] = new Option(_netbanks[p].name + " (+ " + formatter.price(cashier.calculateFee(_netbanks[p].code)) + " " + strCurrency + ")", _netbanks[p].code);
                optionIndex++;
            }
            select.options[optionIndex] = new Option("", -1);
            optionIndex++;            
        }
        if(_webPayments.length > 0) {
            select.options[optionIndex] = new Option("----- " + strWebpayments + " -----", -1);
            optionIndex++;
            for(var m=0; m<_webPayments.length; m++){
                select.options[optionIndex] = new Option(_webPayments[m].name + " (+ " + formatter.price(cashier.calculateFee(_webPayments[m].code)) + " " + strCurrency + ")", _webPayments[m].code);
                optionIndex++;
            }
        }
        cashier.loading(false);
    },
    
    "paymentMethodsReceivingFailed": function(err){
        cashier.loading(false);
        cashier.errorOccured(strConnectionFailed);
    },
            
    "setFeeUserInfo": function (code){
        var element = document.getElementById("invoiceFee");
        var total = document.getElementById("invoiceTotal");
        var newFee = Number(0);
        if(code != 0) {
            newFee = this.calculateFee(code);
            element.innerHTML = format.price(newFee);
            total.innerHTML = format.price(this.calculateTotal(newFee));
        } else {
            element.innerHTML = format.price(newFee);
            total.innerHTML = format.price(this.calculateTotal(newFee));
        }
        if(totalCredit > 0) {
            document.getElementById("giftCertificateLabel").innerHTML = strGiftCertificates + " (" + strCurrency + " " + format.price(totalCredit) + ")";
            if(this.calculateTotal(newFee) == 0){
                document.getElementById("certificateDrawn").innerHTML = "-" + format.price(this.calculateTotalBuy(newFee));
            } else {
                document.getElementById("certificateDrawn").innerHTML = "-" + format.price(totalCredit);
            }
        }
        
    },
    
    "calculateFee": function (code){
        for(var i=0; i<fees.length; i++){
            feeObject = fees[i];
            if(feeObject['code'] == code){
                percent = new Number(feeObject['percent']);
                minimumFee = new Number(feeObject['minimum']);
                aFee =  new Number (feeObject['fee']);	
                rfee = Math.round(new Number(basePrice) * (percent/100) + aFee);
                if(minimumFee > rfee){
                    rfee = minimumFee;
                }
                return rfee;
            }
        }
    },
    
    "calculateTotal": function (newFee){
        var price = newFee + basePrice;
        return price - totalCredit < 0 ? 0 : price - totalCredit;
    },
    
    "calculateTotalBuy": function (newFee){
        return newFee + basePrice;
    },

    "addCertificate": function(){
        if(cashier.isLoading() == false) {
            this.errorClear();
            var certificateCode = document.getElementById("certificateCode").value;
            if(certificateCode == ""){
                this.errorOccured(strMissingCertificateCode);
            } else {
                var param = "?paymentMethod=PFGC&cardNumber=" + certificateCode;
                this.addPaymentMethod(param);
            }
        }
    },
    
    "addPaymentMethod": function (param){
        cashier.loading(true);
        param = this.ADD_PAYMENTMETHOD_URL + param;
        var d = loadJSONDoc(param);
        d.addCallbacks(this.paymentMethodAdded,this.paymentMethodAddedFailed);
    },
    
    "paymentMethodAdded": function(data) {
        cashier.errorClear();
        totalCredit = 0;
        var stopLoading = true;
        for(var i=0;i<data.length;i++){
            if(data[i].credit == -1){
                cashier.getInvoice();
                stopLoading = false;
             } else {
                totalCredit = totalCredit + data[i].credit;
                cashier.setFeeUserInfo("PFGC");
                document.getElementById("loading").style.display = "";
                if(document.getElementById("invoiceTotal").innerHTML == "0.00"){
                    document.getElementById("certificateCode").disabled = true;
                    document.getElementById("paymentSwitcher").disabled = true;
                } else {
                    document.getElementById("certificateCode").disabled = false;
                    document.getElementById("paymentSwitcher").disabled = false;                
                }
            }
        }
        if(stopLoading == true){
            cashier.loading(false);
        }
    },
    
    "paymentMethodAddedFailed": function(er) {
        cashier.errorOccured(strPaymentVerificationFailed);
        cashier.loading(false);
    },
    
    "acceptPayment": function(){
        if(cashier.isLoading() == false){
            this.errorClear();
            var paymentMethod = document.getElementById("paymentSwitcher").options[document.getElementById("paymentSwitcher").selectedIndex].value;
            var cardNumber = document.getElementById("cardNumber").value;
            var cvc = document.getElementById("cvc").value;
            var expireMonth = document.getElementById("expireMonth").value;
            var expireYear = document.getElementById("expireYear").value;
            if(totalCredit != -1 && totalCredit < cart.totalAmount()){
                if(paymentMethod == -1){
                    this.errorOccured(strMissingPaymentMethod);
                } else if(cardNumber == ""){
                    this.errorOccured(strMissingCardNumber);
                } else if(cvc == ""){
                    this.errorOccured(strMissingCVC);
                } else if(expireMonth == ""){
                    this.errorOccured(strMissingExpireMonth);
                } else if(expireYear == ""){
                    this.errorOccured(strMissingExpireYear);
                } else {    
                    var param = "?paymentMethod=" + paymentMethod + "&cardNumber=" + cardNumber + "&expireMonth=" + expireMonth + "&expireYear=" + expireYear + "&cvc=" + cvc;
                    this.addPaymentMethod(param);
                }
            } else {
                this.getInvoice();
            }
        }
    },
    
    "getInvoice": function(){
        var email = document.getElementById("login").value;
        var email2 = document.getElementById("repeatedLogin").value;
        var terms = document.getElementById("isTermsAccepted").checked ? "yes" : "no";
        if( email != email2 ){
            cashier.errorOccured(strEmailsDontMatch);            
        } else if(terms != "yes"){
            cashier.errorOccured(strTermsNotAccepted);
        } else {
            cashier.loading(true);
            var d = loadJSONDoc(cashier.INVOICE_URL + email + "&language=" + language);
            d.addCallbacks(cashier.invoiceReceived, cashier.invoiceFailed);
        }
    },
    
    "invoiceReceived": function (data){
       if(data.status == "running"){
            setTimeout("cashier.getInvoice()",3000);
        } else {
            cashier.errorClear();
            var formatter = new Format();
            var finalPresentation = receiptPresentation;
            finalPresentation = finalPresentation.replace("order.orderIdentifier", data.orderIdentifier);
            finalPresentation = finalPresentation.replace("order.transactionIdentifier", data.transactionIdentifier);
            finalPresentation = finalPresentation.replace("order.email", data.user);
            finalPresentation = finalPresentation.replace("order.date", data.date);
            finalPresentation = finalPresentation.replace("order.totalFee", formatter.price(data.totalFee));
            finalPresentation = finalPresentation.replace("order.totalAmount", formatter.price(data.totalAmount));
            finalPresentation = finalPresentation.replace("order.totalPaid", formatter.price(data.totalPaid));
            finalPresentation = finalPresentation.replace("order.giftCertificateAmount", formatter.price(data.giftCertificateAmount));  
            finalPresentation = finalPresentation.replace("order.currency", data.currency);
            finalPresentation = finalPresentation.replace("order.currency", data.currency);
            finalPresentation = finalPresentation.replace("order.currency", data.currency);
            finalPresentation = finalPresentation.replace("order.currency", data.currency);
            finalPresentation = finalPresentation.replace("order.currency", data.currency);
            if(data.giftCertificateAmount == 0 || data.giftCertificateAmount == "0"){
                var startIndex = finalPresentation.indexOf("subTotalRow") - 8;
                var endIndex = finalPresentation.indexOf("totalRow") - 8;
                finalPresentation = finalPresentation.substring(0,startIndex) + finalPresentation.substring(endIndex,finalPresentation.length);
            }
            var lineItemsPresentations = "";
            for(var j=0;j<data.lineItems.length;j++){
                lineItemsPresentations = lineItemsPresentations + formatter.lineItem(lineItemPresentation,data.lineItems[j]);
            } 
            finalPresentation = finalPresentation.replace("lineItemsOfTheReceipt", lineItemsPresentations);
			if(document.getElementById("giftCertificatesIsUsed") != null){
			  if(data.giftCertificatesUsed.length > 0){
			     var usedGiftcertifiactesPresentations = "";
			     for(var j=0;j<data.giftCertificatesUsed.length;j++){
			         usedGiftcertifiactesPresentations = usedGiftcertifiactesPresentations + formatter.usedGiftCertificate(usedGiftCertificatePresentation,data.giftCertificatesUsed[j]);
			     }
			     finalPresentation = finalPresentation.replace("usedGiftcertificatesOfTheReceipt", usedGiftcertifiactesPresentations);
			  } else {
			     finalPresentation = finalPresentation.replace(formatter.presentation(document.getElementById("giftCertificatesIsUsed").innerHTML), ""); 
			  }
			}
			_invoiceHTML = finalPresentation;
			cashier.encodeAssets("recent");
        }
    },
    
    "invoiceFailed": function (err){
        cashier.loading(false);
        cashier.errorOccured(strDibsOrEncodingError);
    },
    
    "encodeAssets": function(criteria){
        cashier.loading(true);
        if(clientInfo != null){
            var url = cashier.ASSET_URL;
            var content = "criteria=" + criteria + "&clientinfo="+clientInfo;
            var req = getXMLHttpRequest();
            req.open("POST", url, true);
            var d = sendXMLHttpRequest(req, content);
            d.addCallbacks(cashier.evalEncodedAssetsRecieved, cashier.assetsFailed);
        } else {
            var requestStr = cashier.ASSET_URL + "?criteria=" + criteria;
            var d = loadJSONDoc(requestStr);
            d.addCallbacks(cashier.encodedAssetsRecieved, cashier.encodedAssetsFailed);
        }
    },
    
    "evalEncodedAssetsRecieved": function(req){
        cashier.encodedAssetsRecieved(evalJSONRequest(req));
    },
    
    "encodedAssetsRecieved": function(encodedAssets){
         if(encodedAssets.status == "running") {
            setTimeout("cashier.encodeAssets('checking')",3000);
        } else {
            cashier.errorClear();
            cashier.loading(false);
            document.getElementById("loading").style.display = "none";
            document.getElementById("payment").style.display = "none";
            document.getElementById("assetChooser").style.display = "none";
            var _formatter = new Format();
            var finalPresentation = "";
            if(encodedAssets.length > 0) {
                for(var i=0;i<encodedAssets.length;i++){
                    if(typeof encodedAssets[i].license != 'undefined'){        
                        document.getElementById("predeliverObj").storeLicense("'" + encodedAssets[i].license + "'");
                    }
                    finalPresentation = finalPresentation + format.encodedAsset(encodedAssetPresentation, encodedAssets[i]);
        	   }
            }	
            document.getElementById("encodedAssets").innerHTML = finalPresentation;  
            document.getElementById("receipt").style.display = "block";
            document.getElementById("download").style.display = "block";
            document.getElementById("disableShopLayer").style.height = document.body.scrollHeight + "px"
            document.getElementById("disableShopLayer").style.width = document.body.scrollWidth + "px";        
		}
    },
    
    "assetsFailed": function(err){
        cashier.loading(false);
        cashier.errorOccured(strEncodingError);
    },
    
	"errorClear": function(){
	   document.getElementById("paymentError").style.display = "none";
	},
	
	"errorOccured": function(err) {
	   document.getElementById("paymentError").innerHTML = err;
	   document.getElementById("paymentError").style.display = "block";
	   cashier.loading(false);
	},
	
	"openInvoiceWindow": function(){
	   var str = "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\"><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\"><title>PopUpShop</title><link rel=\"stylesheet\" href=\"screen.css\"></head><body><div id=\"receiptWrapper\">" + _invoiceHTML + "</div></body></html>";
	   var new_window = window.open(null,"PopUpShop","width=500,height=500,scrollbars=1");
	   new_window.document.write(str);
	   new_window.document.close();
	   new_window.focus();
	},
	
	"openTermsWindow": function(){
	   var url = window.location + "";
	   var portalURL;
	   var urlFragments = url.split("/");
	   for(var i=urlFragments.length; i>0;i--){
	       if(urlFragments[i-1] != "" && typeof urlFragments[i-1] !="undefined" && urlFragments[i-1] != "index.html"){ 
	           portalURL = urlFragments[i-1];
                break;
	       }
	   }
	   var new_window = window.open("../terms." + language + ".html?" + portalURL, null ,"width=500,height=500,scrollbars=1");
	   new_window.focus();
	},
	
	"openHelpWindow": function(){
	   var url = window.location + "";
	   var portalURL;
	   var urlFragments = url.split("/");
	   for(var i=urlFragments.length; i>0;i--){
	       if(urlFragments[i-1] != "" && typeof urlFragments[i-1] !="undefined" && urlFragments[i-1] != "index.html"){ 
	           portalURL = urlFragments[i-1];
                break;
	       }
	   }
	   var new_window = window.open("../help." + language + ".html?" + portalURL, null,"width=500,height=500,scrollbars=1");
	   new_window.focus();
	},

	"orderZip": function(){
	   cashier.loading(true);
	   document.getElementById("zipButton").innerHTML = "<img src=\"" + imgZip_waiting + "\" />";
	   var d = loadJSONDoc(cashier.ZIP_URL);
	   d.addCallbacks(cashier.zipReceived, cashier.zipFailed);
    },
       
    "zipReceived": function (zipper){
        //alert("recieved zip status");
        if(zipper.status == "running"){
            setTimeout("cashier.orderZip()",3000);
            /*var d = loadJSONDoc(cashier.ZIP_URL);
            d.addCallbacks(cashier.zipReceived, cashier.zipFailed);
            alert("asking for zip");
            */
        } else {
            cashier.errorClear();
            document.getElementById("zipButton").innerHTML = "<a href=\"" + zipper.url + "\"><img src=\"" + imgZip_download + "\" /></a>";
	       cashier.loading(false);
        }
    },
    
    "zipFailed": function (err){
        cashier.loading(false);
        document.getElementById("zipButton").innerHTML = "<img src=\"" + imgZip_failed + "\" />";
    },
    
    "close": function(){
        this.errorClear();
        //cart.status();
        document.getElementById("disableShopLayer").style.height = "0px";
        document.getElementById("disableShopLayer").style.visibility = 'hidden';
        document.getElementById("checkoutWrapper").style.visibility = 'hidden';
        document.getElementById("payment").style.display = "none";
        document.getElementById("download").style.display = "none";
        document.getElementById("assetChooser").style.display = "none";
        var url = window.location + "";
        url = url.substring(url.indexOf("://"), url.length);
        window.location = "http" + (url.indexOf("?") != -1 ? url.substring(0,url.indexOf("?")) : url );
        //window.location = (url.indexOf("https") != -1 ? "http" + url.substring(5,url.length) : url ) + "?action=payment";
    },
    
    "loading": function(value){
        if(value == true) {
            document.getElementById("loading").style.display = "block";
            document.getElementById("close").style.display = "none";
        } else {
            document.getElementById("loading").style.display = "none";
            document.getElementById("close").style.display = "block";        
        }
    },
    
    "isLoading": function() {
        if(document.getElementById("loading").style.display == "block") {
            return true;
        } else {
            return false;
        }    
    }
        
}

var cashier = new Cashier();

/////////////////////////////////////////////////////////////////
// REDOWNLOAD
/////////////////////////////////////////////////////////////////

var choosenAssets = [];
var redownload_user;
var redownload_token;
var assetPresentation;

Redownload = function(){
    this.ORDER_INVITE_URL = serverName + portalName + "/invitation.json";
    this.ALL_ASSETS_URL = serverName + portalName + "/assets.json";
    this.ENCODE_ASSETS_URL = serverName + portalName + "/assets.json";
    this.LOG_IND_URL = serverName + portalName + "/user.json";
}

Redownload.prototype = {

    "initialize": function(){
        assetPresentation = document.getElementById("assets").innerHTML;
    },

	"showOrderingForm": function() {
	   if(document.getElementById("orderRedownload").style.visibility != 'visible') {
	       document.getElementById("orderRedownload").style.visibility = 'visible';
	   } else {
	       document.getElementById("orderRedownload").style.visibility = 'hidden';	   
	       document.getElementById("orderRedownloadConfirm").style.display = "none";
	       document.getElementById("orderRedownloadError").style.display = "none";
	   }
	},
	
	"closeOrderingForm": function(){
	   if(document.getElementById("orderRedownload").style.visibility != 'visible') {
	       document.getElementById("orderRedownload").style.visibility = 'visible';
	   } else {
	       document.getElementById("orderRedownload").style.visibility = 'hidden';	   
	       document.getElementById("orderRedownloadConfirm").style.display = "none";
	       document.getElementById("orderRedownloadError").style.display = "none";
	   }
	},
	
	"order": function() {
	   var email = document.getElementById("redownloadEmail").value;
	   if(email == "" || email == strOrderRedownloadValue) {
	       document.getElementById("orderRedownloadError").innerHTML = strMissingEmail;	   
	       document.getElementById("orderRedownloadError").style.display = "block";	   
	   } else {
	       document.getElementById("orderRedownloadError").innerHTML = "";	   
	       document.getElementById("orderRedownloadError").style.display = "none";
		   var url = window.location.href;
	       var d = loadJSONDoc(redownload.ORDER_INVITE_URL + "?user=" + email + "&shopPath=" + url + "&language=" + language);
		   d.addCallbacks(redownload.invitationSent, redownload.invitationFailed);
	   }
	},
	
	"invitationSent": function(){
        document.getElementById("orderRedownloadConfirm").style.display = "block";
        document.getElementById("orderRedownloadError").style.display = "none";	   	
        document.getElementById("orderRedownloadConfirm").innerHTML = strInvitationSent;	   
	},
	
    "invitationFailed": function(err){
        document.getElementById("orderRedownloadError").style.display = "block";	   	
        document.getElementById("orderRedownloadConfirm").style.display = "none";
        document.getElementById("orderRedownloadError").innerHTML = strInvitationNotSent;	   
	},
	
    "showAssetChooser": function(user, token){
        if(user != null && token != null){
            document.getElementById("disableShopLayer").style.visibility = 'visible';         
            document.getElementById("disableShopLayer").style.height = (document.documentElement.scrollHeight > document.body.scrollHeight ? document.documentElement.scrollHeight : document.body.scrollHeight) + "px";
            document.getElementById("disableShopLayer").style.width = document.body.scrollWidth + "px";        
            document.getElementById("checkoutWrapper").style.visibility = 'visible';
            document.getElementById("payment").style.display = "none";
            document.getElementById("download").style.display = "none";
            document.getElementById("assetChooser").style.display = "none";
            cashier.loading(true);
            var d = loadJSONDoc(this.LOG_IND_URL + "?user=" + user + "&token=" + token);
            d.addCallbacks(this.loggedIn, this.logindFailed);
        }
	},
	
	"loggedIn": function (user) {
	    var d = loadJSONDoc(redownload.ALL_ASSETS_URL + "?criteria=any");
        d.addCallbacks(redownload.assetsRecieved, redownload.logindFailed);           
	},
	
	"logindFailed": function (err) {
	   cashier.loading(false);
        cashier.errorOccured(strLogindFailed);
	},
	
	"assetsRecieved": function (assets){
        cashier.loading(false);
        cashier.errorClear();
        var _formatter = new Format();
        var finalPresentation = "";
        if(assets.length > 0) {
            var singlePresentation;
            for(var i=0;i<assets.length;i++){
                finalPresentation = finalPresentation + _formatter.asset(assetPresentation, assets[i]);
            }
        }
        document.getElementById("assets").innerHTML = finalPresentation;
        document.getElementById("assetChooser").style.display = "block";  	
        document.getElementById("loading").style.display = "";  	
        document.getElementById("disableShopLayer").style.height = document.body.scrollHeight + "px"
        document.getElementById("disableShopLayer").style.width = document.body.scrollWidth + "px";        

	},
	
	"assetsFailed": function (err) {
	   cashier.errorOccured(strConnection);
	},
	
	"chooseAsset": function(node, assetID) {
	   var found = false;
	   for(var i=0; i<choosenAssets.length; i++){
	       if(choosenAssets[i] == assetID) {
	           for(var k=i; k<choosenAssets.length-1; k++){
	               choosenAssets[k] = choosenAssets[k++];	           
	           }
	           found = true;
	           choosenAssets[choosenAssets.length-1] = null;
	           node.innerHTML = "<img src=\"" + imgSelectAsset + "\" />";
	           break;
	       }
	   }
	   if(!found){
	       choosenAssets[choosenAssets.length] = assetID;
	       node.innerHTML = "<img src=\"" + imgDeselectAsset + "\" />";
	   }
	},
	
	"encode": function(){
	   if(cashier.isLoading() == false) {
            var param = "";
            for(var i=0; i<choosenAssets.length; i++){
                param = param + "criteria=" + choosenAssets[i] + "&";
            }
            cashier.loading(true);
            if(clientInfo != null){
                var url = redownload.ENCODE_ASSETS_URL;
                var content = param.substring(0,param.length - 1) + "&clientinfo="+clientInfo;
                var req = getXMLHttpRequest();
                req.open("POST", url, true);
                var d = sendXMLHttpRequest(req, content);
                d.addCallbacks(redownload.evalEncodedAssetsRecieved, cashier.assetsFailed);
            } else {
                var requestStr = redownload.ENCODE_ASSETS_URL + "?" + param.substring(0,param.length - 1);
                var d = loadJSONDoc(requestStr);
                d.addCallbacks(redownload.encodedAssetsForRedownloadRecieved, cashier.assetsFailed);
            }
        }
        window.document.body.scrollTop = 0;
        window.document.documentElement.scrollTop = 0;
    },
    
    "evalEncodedAssetsRecieved": function(req){
        redownload.encodedAssetsForRedownloadRecieved(evalJSONRequest(req));
    },
	
	"checkingForEncodingStatus": function() {
	    cashier.loading(true);
        if(clientInfo != null){
            var url = cashier.ASSET_URL;
            var content = "criteria=checking&clientinfo="+clientInfo;
            var req = getXMLHttpRequest();
            req.open("POST", url, true);
            var d = sendXMLHttpRequest(req, content);
            d.addCallbacks(redownload.evalEncodedAssetsRecieved, cashier.assetsFailed);            
        } else {
            var d = loadJSONDoc(cashier.ASSET_URL + "?criteria=checking");
            d.addCallbacks(redownload.encodedAssetsForRedownloadRecieved, cashier.assetsFailed);            
        }
	},
    
    "encodedAssetsForRedownloadRecieved": function(encodedAssets){
        if(encodedAssets.status == "running") {
            setTimeout("redownload.checkingForEncodingStatus()",3000);
        } else {
            cashier.errorClear();
            cashier.loading(false);
            document.getElementById("loading").style.display = "none";
            document.getElementById("payment").style.display = "none";
            document.getElementById("assetChooser").style.display = "none";
            var _formatter = new Format();
            var finalPresentation = "";
            if(encodedAssets.length > 0) {
                for(var i=0;i<encodedAssets.length;i++){
                    if(typeof encodedAssets[i].license != 'undefined'){
                        document.getElementById("predeliverObj").storeLicense("'" + encodedAssets[i].license + "'");
                    }
                    finalPresentation = finalPresentation + format.encodedAsset(encodedAssetPresentation, encodedAssets[i]);
        	   }
            }	
            document.getElementById("encodedAssets").innerHTML = finalPresentation;  
            document.getElementById("download").style.display = "block";
            document.getElementById("receipt").style.display = "none";
            document.getElementById("disableShopLayer").style.height = document.body.scrollHeight + "px"
            document.getElementById("disableShopLayer").style.width = document.body.scrollWidth + "px";
            window.document.body.scrollTop = 0;
		    window.document.documentElement.scrollTop = 0;
		}
    }

}

var redownload = new Redownload();

/////////////////////////////////////////////////////////////////
// UTILITY
/////////////////////////////////////////////////////////////////

CardUtility = function(){
    this.formChain = new Array();
}

function switchField(e) {
    cardUtility.switchField(e);
}

CardUtility.prototype = {
    
        "initialize": function() {
            this.formChain[0] = new Array(document.getElementById("cardNumber1"), 4, null, document.getElementById("cardNumber2"), "");
            this.formChain[1] = new Array(document.getElementById("cardNumber2"), 4, document.getElementById("cardNumber1"), document.getElementById("cardNumber3"), "");
            this.formChain[2] = new Array(document.getElementById("cardNumber3"), 4, document.getElementById("cardNumber2"), document.getElementById("cardNumber4"), "");
            this.formChain[3] = new Array(document.getElementById("cardNumber4"), 4, document.getElementById("cardNumber3"), document.getElementById("expireMonth"), "");
            this.formChain[4] = new Array(document.getElementById("expireMonth"), 2, document.getElementById("cardNumber4"), document.getElementById("expireYear"), "");
            this.formChain[5] = new Array(document.getElementById("expireYear"), 2, document.getElementById("expireMonth"), document.getElementById("cvc"), "");
            this.formChain[6] = new Array(document.getElementById("cvc"), 4, document.getElementById("expireYear"), null, "");
         	document.getElementById("cardNumber1").onkeyup = switchField;
            document.getElementById("cardNumber2").onkeyup = switchField;
            document.getElementById("cardNumber3").onkeyup = switchField;
            document.getElementById("cardNumber4").onkeyup = switchField;
            document.getElementById("expireMonth").onkeyup = switchField;
            document.getElementById("expireYear").onkeyup = switchField;
            document.getElementById("cvc").onkeyup = switchField;
        },
        
        "setCardNumber": function (fullNumber) {
            if(fullNumber != "") {
				if(fullNumber.length > 4) {
					document.getElementById("cardNumber1").value = fullNumber.substring(0,4);
					if(fullNumber.length > 8) {
						document.getElementById("cardNumber2").value = fullNumber.substring(4,8);
						if(fullNumber.length > 12) {
							document.getElementById("cardNumber3").value = fullNumber.substring(8,12);
							if(fullNumber.length > 12) {
								document.getElementById("cardNumber4").value = fullNumber.substring(12,fullNumber.length);
							}
						} else {
							document.getElementById("cardNumber3").value = fullNumber.substring(8,fullNumber.length);
						}
					} else {
						document.getElementById("cardNumber2").value = fullNumber.substring(4,fullNumber.length);
					}
				} else {
					document.getElementById("cardNumber1").value = fullNumber;
				}
			}
        },

        "switchField": function(e){
            var evtobj=window.event? event : e
            var unicode=evtobj.charCode? evtobj.charCode : evtobj.keyCode
            var element=e? evtobj.currentTarget: evtobj.srcElement; 
            var actualkey=String.fromCharCode(unicode)
            if(element) {
                if(this.maxCharReached(element)) {
                    var nextElement = this.nextFormElement(element);
				    if(nextElement != -1)
				        nextElement.focus();
				}
				else if((this.lastKnownValue(element) == "" || this.lastKnownValue(element) == element.value) && unicode == '8'){
				    var prevElement = this.previousFormElement(element);
				    if(prevElement != -1) {
				        prevElement.focus();
                        prevElement.value = prevElement.value.substring(0,prevElement.value.length-1);
                    }
                }
            }
            for(var k=0; k<this.formChain.length; k++){
                this.formChain[k][4] = this.formChain[k][0].value;
                document.getElementById("cardNumber").value = this.formChain[0][0].value + this.formChain[1][0].value + this.formChain[2][0].value + this.formChain[3][0].value;
            }
        },
			
		"maxCharReached" : function(formElement) {
            for(var i=0; i<this.formChain.length; i++){
                if(formElement.id == this.formChain[i][0].id) {
                    if(formElement.value.length >= this.formChain[i][1]){
                        return true;
                    }
				}
            }
            return false;
        },
        
        "lastKnownValue" : function (formElement){
            for(var i=0; i<this.formChain.length; i++){
                if(formElement.id == this.formChain[i][0].id) {
						return this.formChain[i][4];
				}
            }
            return null;
        },

        "nextFormElement" : function (formElement){
            for(var i=0; i<this.formChain.length; i++){
                if(formElement.id == this.formChain[i][0].id) {
                    var nextElement = this.formChain[i][3];
                    if(nextElement != null){
                        return nextElement;
				    }
				}
            }
            return -1;
        },

        "previousFormElement": function (formElement){
            for(var i=0; i<this.formChain.length; i++){
                if(formElement.id == this.formChain[i][0].id) {
                    var prevElement = this.formChain[i][2];
                    if(prevElement != null){
                        return prevElement;
                    }
				}
            }
            return -1;
        }
}

var cardUtility = new CardUtility();

////////////////////////////////////////////////////////////////////////////
// Formatters
////////////////////////////////////////////////////////////////////////////

Format = function(){

}

Format.prototype = {
    
    "artists": function(artists) {
	   if(artists != null){
	       var str = "";
	       for(var i=0;i<artists.length;i++){
	           if(i == 0) {
	               str = artists[i].name;
	           } else {
	               str = str + ", " + artists[i].name
	           }
	       }
	       return str;
	   }
	},
		
	"cover": function (src, height, width) {
	   return "<img src=\"../../images/" + src + "\" height=\"" + height + "\" width=\"" + width + "\" />"
	},
	
    "price": function (value){
	   str = new String(value);
	   while(3 > str.length){
	        str = '0'+str;
	   }
	   n = str.length;
	   return str.substring(0, n-2)+'.'+str.substring(n-2, n);
    },
    
    "duration": function (product) {
        if(product.entityType == "Track"){
            var duration;
            var min = Math.floor(product.duration/60);
            var sec = product.duration%60;
            if(sec == 0) {
                return min + ":00";
            }
            else if(sec < 10) {
                return min+":0" + sec;
            }
            return min+":"+sec;
        } else {
            return product.duration + " " + strTracks;
        }
    },
    
    "productContexts": function (product, wrapperTag, size) {
	   if(product != null){
	       var str = "";
	       var img = imgBuyLarge;
	       if(size == "small"){
	           img = imgBuySmall;     
	       }
	       for(var i=0;i<product.productContexts.length;i++){
	           if(product.entityType == "Movie"){
	               str = str + "<" + wrapperTag + " class=\"screenratio\">" + product.productContexts[i].screenRatio + "</div>";
	           }
	           str = str + "<" + wrapperTag + " class=\"variation\">" + product.productContexts[i].variation + "</div>";
	           str = str + "<" + wrapperTag + " class=\"currency\">" + product.productContexts[i].currency + "</div>";
	           str = str + "<" + wrapperTag + " class=\"price\">" + this.price(product.productContexts[i].price) + "</div>";
	           str = str + "<" + wrapperTag + " class=\"buyButton\"><a href=\"javascript:void(0)\" onclick=\"cart.add(event, this, '" + product.productContexts[i].id + "')\"><img src=\"" + img + "\" /></a></div>";
	           if(document.getElementById("notice_" + product.productContexts[i].id) == null){
	               str = str + "<" + wrapperTag + " class=\"star\" id=\"notice_" + product.productContexts[i].id + "\"><img src=\"check.gif\" /></div>";
	           } else {
	               str = str + "<" + wrapperTag + " class=\"star\" id=\"notice2_" + product.productContexts[i].id + "\"><img src=\"check.gif\" /></div>";	           
	           }
            }
	       return str;
	   }    
    },
    
    "remove": function (product) {
        return "<a href=\"javascript:cart.remove('" + product.id + "')\"><img src=\"" + imgRemove + "\" /></a>";
    },
    
    "sample": function (product) {
        var str = "";
        if(product.entityType == "Track"){
            var artists = this.artists(product.displayArtists);
            var url = product.sample;
            var name = product.name;
            while(name.indexOf("'") != -1){
                name = name.replace(/'/, "");
            }
            var str = "<a href=\"javascript:player.playTrackInPlayer('" + url + "','" + name + "','" + artists + "')\"><img src=\"" + imgSample + "\"/></a>";
        } else if(product.entityType == "MusicVideo") {
            var str = "<a href=\"javascript:player.openPopupPlayer('" + product.sample + "')\"><img src=\"" + imgMovieSample + "\"/></a>";
        } else {
            var str = "<img src=\"" + imgAlbum + "\"/>";        
        }
        return str;
    },
    
    "name": function(str, maxlength){
        if(str.length > maxlength){
            str = str.substring(0,maxlength - 3) + "...";
        }
        return str;
    },
    
    "validateStr": function (value){
        if(typeof value != 'undefined'){
            return value;
        }
        return "";
    },
    
    "cartItem": function (container, product) {
        container = container.replace( "item.name", this.name(product.name, cartItemNameLength));
        container = container.replace( "item.artist", this.name(this.artists(product.displayArtists), cartItemArtistLength));
        container = container.replace( "item.releaseYear", this.validateStr(product.releaseYear));
        container = container.replace( "item.sample", this.sample(product));
        container = container.replace( "item.label", this.validateStr(product.label));
        container = container.replace( "item.duration", this.duration(product));
        container = container.replace( "item.smallCover", this.cover(product.smallCover, smallCoverHeight, smallCoverWidth));
        container = container.replace( "item.mediumCover", this.cover(product.mediumCover, mediumCoverHeight, mediumCoverWidth));
        container = container.replace( "item.remove", this.remove(product));
        container = container.replace( "item.currency", this.validateStr(product.currency));
        container = container.replace( "item.variation", this.validateStr(product.variation));
        container = container.replace( "item.price", this.validateStr(this.price(product.price)));
        return container;		
    },
    
    "product": function(container, product, entity) {
        container = container.replace( entity + ".name", this.name(product.name, productNameLength));
        container = container.replace( entity + ".artist", this.name(this.artists(product.displayArtists), productArtistLength));
        container = container.replace( entity + ".releaseYear", this.validateStr(product.releaseYear));
        container = container.replace( entity + ".sample", this.validateStr(this.sample(product)));
        container = container.replace( entity + ".label", this.validateStr(product.label));
        container = container.replace( entity + ".duration", this.duration(this.validateStr(product)));
        container = container.replace( entity + ".originalTitle", this.validateStr(product.originalTitle));
        container = container.replace( entity + ".language", this.validateStr(product.language));
        container = container.replace( entity + ".subtitles", this.validateStr(product.subtitles));
        container = container.replace( entity + ".advisory", this.validateStr(product.advisory));
        container = container.replace( entity + ".about", this.validateStr(product.about));
        container = container.replace( entity + ".remove", this.remove(product));
        if(entity == "movie"){
            container = container.replace( entity + ".smallCover", this.cover(product.smallCover, smallMovieCoverHeight, smallMovieCoverWidth));
            container = container.replace( entity + ".mediumCover", this.cover(product.mediumCover, mediumMovieCoverHeight, mediumMovieCoverWidth));
            container = container.replace( entity + ".largeCover", this.cover(product.largeCover, largeMovieCoverHeight, largeMovieCoverWidth));
        } else {
            container = container.replace( entity + ".smallCover", this.cover(product.smallCover, smallCoverHeight, smallCoverWidth));
            container = container.replace( entity + ".mediumCover", this.cover(product.mediumCover, mediumCoverHeight, mediumCoverWidth));
        }
        if(product.productContexts != '' && product.bundling == "NO" && product.productContexts != 'undefined'){
            container = container.replace( entity + ".currency",  product.productContexts[0].currency);
            container = container.replace( entity + ".variation", product.productContexts[0].variation);
            container = container.replace( entity + ".screenRatio", this.validateStr(product.productContexts[0].screenRatio));
            container = container.replace( entity + ".price", this.price(product.productContexts[0].price));
            if(entity == "album"){
                container = container.replace( entity + ".productContexts", this.productContexts(product, "div", "large"));
            } else {
                container = container.replace( entity + ".productContexts", this.productContexts(product, "div", "small"));
            }
        } else {
            container = container.replace( entity + ".productContexts", "");
        }
        if(container.indexOf(".infoLink") != -1){
            container = container.replace( entity + ".infoLink", "<a href=\"javascript:contentManager.focusProduct('" + product.id + "')\"><img src='" + imgInfo + "' /></a>");
        }
        return container;		
    },
    
    "encodedAsset": function(container, asset){
        var downloadStr = "<a href=\"" + serverName + portalName + "/mediafile.json?asset=" + asset.id + "\"><img src=\"" + imgDownload + "\"></a>";
        container = container.replace( "encodedAsset.name", this.name(asset.name, assetNameLength));
        container = container.replace( "encodedAsset.artist", this.name(this.artists(asset.artists), assetArtistLength));
        container = container.replace( "encodedAsset.numDownloadsRemaining", asset.numRedownloads);
        container = container.replace( "encodedAsset.downloadButton", downloadStr);
        return container;
    },

    "asset": function(container, asset){
        container = container.replace( "asset.name", this.name(asset.name, assetNameLength));
        container = container.replace( "asset.artist", this.name(this.artists(asset.artists), assetArtistLength));
        container = container.replace( "asset.numDownloadsRemaining", asset.numRedownloads);
        container = container.replace( "asset.id", asset.id);
        return container;
    },
    
    "usedGiftCertificate": function(container, certificate){
        container = container.replace( "giftcertificate.code", certificate.code);
        container = container.replace( "giftcertificate.currency", certificate.currency);
        container = container.replace( "giftcertificate.amount", certificate.amount);
        return container;        
    },
            
    "lineItem": function(container, lineItem){
        container = container.replace( "lineItem.name", this.name(lineItem.name, lineItemNameLength));
        container = container.replace( "lineItem.artist", this.name(this.artists(lineItem.artists), lineItemArtistLength));
        container = container.replace( "lineItem.currency", lineItem.currency);
        container = container.replace( "lineItem.variation", lineItem.variation);
        container = container.replace( "lineItem.price", this.price(lineItem.price));
        return container;    
    },
    
    "presentation": function (html) {
        if(html != null) {
            html = html.replace(/([a-z])\s*(=)\s*("|')/gi, '$1$2$3');
            if (parts = html.match(/(<\/?[a-z][a-z0-9]*| [a-z]+=)/gi)) {
                for (var i = 0; i < parts.length; i++) {
                    var part = parts[i];
                    html = html.replace(new RegExp(part, 'g'), part.toLowerCase());
                }
            }
        }
        return html;
    }

}

format = new Format();

/////////////////////////////////////////////////////////////////
// GLOBAL
/////////////////////////////////////////////////////////////////

window.onresize = resize;
function resize() {
    if(document.getElementById("disableShopLayer").style.visibility == "visible"){
        document.getElementById("disableShopLayer").style.height = (document.documentElement.scrollHeight > document.body.scrollHeight ?document.documentElement.scrollHeight : document.body.scrollHeight) + "px";
        document.getElementById("disableShopLayer").style.width = document.body.scrollWidth + "px";                
    }
}

function wait(ms){
    var waitFlag = true;
    var p = window.setTimeout("waitFlag=false", ms);
    while(waitFlag){
        ;
    }
}
function insertStars() {
    if(document.getElementById("cartActions").innerHTML == ""){
        setTimeout("insertStars()",500);
    } else {
	   for(var i=0; i<items.length; i++){
		  var element = document.getElementById("notice_" + items[i].id);
		  if(element != null){
		      element.style.display = 'block';
		  }
		  var element2 = document.getElementById("notice2_" + items[i].id);
		  if(element2 != null){
		      element2.style.display = 'block';
		  }
		}
    }
}

