var download = null;

var GadgetEnvironment = {
    IGOOGLE        : "ig",
    VISTA_SIDEBAR  : "vista",
    OSX_DASHBOARD  : "dashboard",
    YAHOO_WIDGETS  : "yahoo",
    NETVIBES       : "netvibes",
    IPHONE_NATIVE  : "iphone",
    FACEBOOK       : "facebook",
    ADOBE_AIR      : "air"
};


var Download = Class.create({
    ADD_TO_SERVICE : "/gadgets/services/addto/",
    serverURL : null,
    gadgetId : null,
    facebookAppURL : null,
    iphoneAppId : null,

    initialize : function(serverURL, gadgetId, facebookAppURL, iphoneAppId) {
        this.serverURL = serverURL;
        this.gadgetId = gadgetId;
        this.facebookAppURL = facebookAppURL;
        this.iphoneAppId = iphoneAppId;
        if (BrowserDetect.isXP) {
            $('smartDownloadXP').style.display = 'block';
        } else {
            $('smartDownload').style.display = 'block';
        }
        this.setEventObservers(true);
    },

    setEventObservers : function (setObservers) {
        if (setObservers) {
            $('smartDownload').observe('click', this.smartDownload.bind(this));
            $('downloadOSX').observe('click', this.addTo.bind(this, GadgetEnvironment.OSX_DASHBOARD));
            $('downloadVista').observe('click', this.addTo.bind(this, GadgetEnvironment.VISTA_SIDEBAR));
            $('downloadYahoo').observe('click', this.addTo.bind(this, GadgetEnvironment.YAHOO_WIDGETS));
            $('downloadIgoogle').observe('click', this.addTo.bind(this, GadgetEnvironment.IGOOGLE));
            $('downloadFacebook').observe('click', this.addToFacebook.bind(this));
            $('downloadIphone').observe('click', this.addToIphone.bind(this));
            $('downloadNetvibes').observe('click', this.addTo.bind(this, GadgetEnvironment.NETVIBES));
        } else {
            $('smartDownload').stopObserving();
            $('downloadOSX').stopObserving();
            $('downloadVista').stopObserving();
            $('downloadYahoo').stopObserving();
            $('downloadIgoogle').stopObserving();
            $('downloadFacebook').stopObserving();
            $('downloadIphone').stopObserving();
            $('downloadNetvibes').stopObserving();
        }
    },

    smartDownload : function() {
        if (BrowserDetect.isVista || BrowserDetect.isWindows7) {
            this.addTo(GadgetEnvironment.VISTA_SIDEBAR);
        } else if (BrowserDetect.isMac) {
            this.addTo(GadgetEnvironment.OSX_DASHBOARD);
        } else if (BrowserDetect.isXP || BrowserDetect.isWindows) {
            this.addTo(GadgetEnvironment.ADOBE_AIR);
        } else {
            //What to do here?
        }
    },

    addTo : function(env) {
        window.open(this.serverURL + this.ADD_TO_SERVICE + this.gadgetId + "/" + env, "_self");
    },

    addToFacebook : function() {
        window.open(this.facebookAppURL);
    },

    addToIphone : function() {
        window.open('http://www.itunes.com/app/' + this.iphoneAppId);
    }
});

var BrowserDetect = {
    init: function () {
        //BROWSER DATA
        this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
        this.version = this.searchVersion(navigator.userAgent)
                || this.searchVersion(navigator.appVersion)
                || "an unknown version";

        //OS VERSION
        this.OS = this.searchString(this.dataOS) || "an unknown OS";

        //PROPRIETY GETTERS
        this.isWindows = this.OS === "Windows";
        this.isWindows7 = this.OS === "Windows" && this.versionSearchString === "6.1";
        this.isVista = this.OS === "Windows" && this.versionSearchString === "6.0";
        this.isXP = this.OS === "Windows" && this.versionSearchString === "5.1";
        this.isMac = this.OS === 'Mac';
        this.isExplorer = this.browser === "Explorer";
        this.isFirefox = this.browser === "Firefox";
    },

    searchString: function (data) {
        for (var i = 0; i < data.length; i++) {
            var dataString = data[i].string;
            var dataProp = data[i].prop;
            this.versionSearchString = data[i].versionSearch || data[i].identity;
            if (dataString) {
                if (dataString.indexOf(data[i].subString) != -1)
                    return data[i].identity;
            }
            else if (dataProp)
                return data[i].identity;
        }
    },

    searchVersion: function (dataString) {
        var index = dataString.indexOf(this.versionSearchString);
        if (index == -1) return;
        return parseFloat(dataString.substring(index + this.versionSearchString.length + 1));
    },

    dataBrowser: [
        {
            string: navigator.userAgent,
            subString: "Chrome",
            identity: "Chrome"
        },
        {
            string: navigator.userAgent,
            subString: "OmniWeb",
            versionSearch: "OmniWeb/",
            identity: "OmniWeb"
        },
        {
            string: navigator.vendor,
            subString: "Apple",
            identity: "Safari",
            versionSearch: "Version"
        },
        {
            prop: window.opera,
            identity: "Opera"
        },
        {
            string: navigator.vendor,
            subString: "iCab",
            identity: "iCab"
        },
        {
            string: navigator.vendor,
            subString: "KDE",
            identity: "Konqueror"
        },
        {
            string: navigator.userAgent,
            subString: "Firefox",
            identity: "Firefox"
        },
        {
            string: navigator.vendor,
            subString: "Camino",
            identity: "Camino"
        },
        {
            // for newer Netscapes (6+)
            string: navigator.userAgent,
            subString: "Netscape",
            identity: "Netscape"
        },
        {
            string: navigator.userAgent,
            subString: "MSIE",
            identity: "Explorer",
            versionSearch: "MSIE"
        },
        {
            string: navigator.userAgent,
            subString: "Gecko",
            identity: "Mozilla",
            versionSearch: "rv"
        },
        {
            // for older Netscapes (4-)
            string: navigator.userAgent,
            subString: "Mozilla",
            identity: "Netscape",
            versionSearch: "Mozilla"
        }
    ],

    dataOS : [
        {
            string: navigator.userAgent,
            subString: "Windows NT 6.1",
            versionSearch : "6.1",
            identity: "Windows"
        },
        {
            string: navigator.userAgent,
            subString: "Windows NT 6.0",
            versionSearch : "6.0",
            identity: "Windows"
        },
        {
            string: navigator.userAgent,
            subString: "Windows NT 5.1",
            versionSearch : "5.1",
            identity: "Windows"
        },
        {
            string: navigator.platform,
            subString: "Win",
            identity: "Windows"
        },
        {
            string: navigator.platform,
            subString: "Mac",
            identity: "Mac"
        },
        {
            string: navigator.userAgent,
            subString: "iPhone",
            identity: "iPhone/iPod"
        },
        {
            string: navigator.platform,
            subString: "Linux",
            identity: "Linux"
        }
    ]

};

BrowserDetect.init();

function initDownloadWidget(serverURL, gadgetId, facebookAppURL, iphoneAppId) {
    download = new Download(serverURL, gadgetId, facebookAppURL, iphoneAppId);
}