﻿function DownloadHandlerClass() {
    this.urlFormat =
    "http://${downloadDomain}/exe/${rewriteType}/channel/${channelTrackingName}/" +
    "${productTrackingName}.s${skuCode}.c${channelCode}.u${uid}${.rcampaingId}.dl.exe";
    this.channelSKUDataList = {};
}
// Page API
DownloadHandlerClass.prototype.launchDownload = function(channelCode, skuCode) {
    if (!this.isEnabled(channelCode, skuCode))
        return false;
    window.location = this.createDownloadURL(channelCode, skuCode);
    return true;
}
DownloadHandlerClass.prototype.handleClickEvent = function(channelCode, skuCode) {
    // resolve hyperlink element
    var e = window.event;
    if (!e) {
        var f = this.handleClickEvent.caller;
        if (f && f.arguments && f.arguments.length)
            e = f.arguments[0];
    }
    var element = e.target || e.srcElement;
    while (element.parentNode && (!element.tagName || (element.tagName.toUpperCase() != "A"))) {
        element = element.parentNode;
    }
    this.updateHyperLink(channelCode, skuCode, element);

    return true;
}
DownloadHandlerClass.prototype.updateHyperLink = function(channelCode, skuCode, element) {
    if (this.isEnabled(channelCode, skuCode)) {
        element.href = this.createDownloadURL(channelCode, skuCode);
    }
}
DownloadHandlerClass.prototype.createDownloadURL = function(channelCode, skuCode) {
    var channelSKUData = this.getChannelSKUData(channelCode, skuCode);
    var campaingId = this.getCampaingID();    
    return this.createDownloadURLFromData(channelSKUData, campaingId);
}
DownloadHandlerClass.prototype.createDownloadURLFromData = function(channelSKUData, campaingId) {
    if (typeof (campaingId) == "undefined" || campaingId == null)
        campaingId = "";
    var result = this.urlFormat
        .replace("${downloadDomain}", channelSKUData.downloadDomain)
        .replace("${rewriteType}", channelSKUData.rewriteType)
        .replace("${channelTrackingName}", channelSKUData.channelTrackingName)
        .replace("${productTrackingName}", channelSKUData.productTrackingName)
        .replace("${skuCode}", channelSKUData.skuCode)
        .replace("${channelCode}", channelSKUData.channelCode);
    var uidformed = VisitorID.GetVisitorId();
	result= result.replace("${uid}",uidformed != null ? uidformed : "");
	if (campaingId)
        result = result.replace("${.rcampaingId}", ".r" + campaingId);
    else
        result = result.replace("${.rcampaingId}", "");
    return result;
}
DownloadHandlerClass.prototype.isEnabled = function(channelCode, skuCode) {
    var channelSKUData = this.getChannelSKUData(channelCode, skuCode);
    return channelSKUData.downloadHandlerEnabled;
}
// Retrives campaingID from "RefId" query string parameter
DownloadHandlerClass.prototype.getCampaingID = function() {
    var parsedUrl = DownloadHandlerUtils.parseUrl(location.href);
    for (var param in parsedUrl.params) {
        if (param.toLowerCase() == "refid")
            return parsedUrl.params[param];
    }
    return "";
}
// channelSKUDataList Manipulation
DownloadHandlerClass.prototype.setChannelSKUData = function(channelSKUData) {
    var key = this.buildChannelSKUDataKey(channelSKUData.channelCode, channelSKUData.skuCode);
    this.channelSKUDataList[key] = channelSKUData;
}
DownloadHandlerClass.prototype.getChannelSKUData = function(channelCode, skuCode) {
    var key = this.buildChannelSKUDataKey(channelCode, skuCode);
    var result = this.channelSKUDataList[key];
    if (typeof (result) == "undefined")
        throw "Download URL can not be build. Data for given channel-sku pair is not available. Make sure that data was requested and received from server before HandleClickEvent or LaunchDownload methods are invoked. Channel Code: " + channelCode + ". SKU Code: " + skuCode + ".";
    return result;
}
DownloadHandlerClass.prototype.buildChannelSKUDataKey = function(channelCode, skuCode) {
    return channelCode + "-" + skuCode;
}
// Invoked by JavaScript generated by DownloadHandlerData.ashx
DownloadHandlerClass.prototype.receiveData = function(data) {
    for (var i in data) {
        this.setChannelSKUData(data[i]);
    }
}
// Internal Utils
DownloadHandlerUtils = {};
DownloadHandlerUtils.parseUrl = function(url) {
    var parsed = {}
    parsed.full = url;
    parsed.base = url.replace(/\?.*$/, '');
    parsed.protocol = url.replace(/:.*$/, '');
    parsed.domain =
        parsed.base.replace(/^[^:]*:\/[\/]/, '').replace(/[:\/].*$/, '');
    parsed.path = parsed.base.replace(/^[^\/]*\/\/[^\/]*[\/]/, '/');
    parsed.query = url.replace(/^[^?]*\??/, '');
    parsed.params = {};

    var rawParamsArr = parsed.query.split("&");
    for (var i = 0; i < rawParamsArr.length; i++) {
        var paramArr = rawParamsArr[i].split("=");
        parsed.params[paramArr[0]] = paramArr[1];
    }
    return parsed

}
var scr=document.getElementsByTagName('script');
var src=scr[scr.length-1].getAttribute("src");
document.write("<script type='text/javascript' src='" + src.replace('DownloadHandler.js','VisitorId.js') + "'></script>");
document.write("<script type='text/javascript' src='" + src.replace('DownloadHandler.js','OberonParts.js') + "'></script>");
DownloadHandler = new DownloadHandlerClass();
