//TODO: refactor to Data namespace
Cobalt.Website.Common.VehicleDataManagerModule = function(sandbox)
{
    var dataManagers;
    var resultsManagerNamespace = "VehicleDataManager";
    var detailManagerNamespace = "VehicleDetailDataManager";

    function initializeDataManagers()
    {
        dataManagers = {};
        dataManagers[resultsManagerNamespace] = new Cobalt.Website.Data.VehicleResultsDataManagerClass(sandbox);
        dataManagers[detailManagerNamespace] = new Cobalt.Website.Data.VehicleDetailDataManagerClass(sandbox);
    }

    function updateManagersData()
    {
        var instance, namespace;

        for(namespace in dataManagers)
        {
            instance = dataManagers[namespace];

            if (instance instanceof Cobalt.Website.Data.ManagerClass)
            {
               instance.update();
            }
        }
    }

    function exposeManagersToPublic()
    {
        Cobalt.Website.Results.VehicleDataManager = dataManagers[resultsManagerNamespace];
        Cobalt.Website.Data.VehicleDetailDataManager = dataManagers[detailManagerNamespace];
    }
    
    return {
        init:function()
        {
            initializeDataManagers();
            updateManagersData();
            exposeManagersToPublic();

            sandbox.listen(null, Cobalt.Website.Common.Events.RenderingCompleted, updateManagersData, null);
        },
        destroy:function()
        {
            if (window.Cobalt.Website.Results.VehicleDataManager)
            window.Cobalt.Website.Results.VehicleDataManager = null;
        }
	};
};


/**
 * @abstract 
 */
Cobalt.Website.Data.ManagerClass = function()
{
    this._data = null;
};

Cobalt.Website.Data.ManagerClass.prototype = {

    setJsonData : function(jsonData)
    {
        this._data = jsonData;
    },

    getJsonData : function()
    {
        if (!this._data)
        {
            throw new Error("VehicleDataManager => no data.");
        }

        return this._data;
    },

    update : function() { throw new Error("abstract method needs to be implemented"); }
};

/**
 *
 * Vehicle Results Data Manager
 *
 */
Cobalt.Website.Data.VehicleResultsDataManagerClass = function(sandbox)
{
    Cobalt.Website.Data.ManagerClass.call(this); //call base constructor
	this.sandbox = sandbox;
};
Cobalt.Website.Data.VehicleResultsDataManagerClass.prototype = new Cobalt.Website.Data.ManagerClass();
Cobalt.Website.Data.VehicleResultsDataManagerClass.prototype.superClass = Cobalt.Website.Data.ManagerClass.prototype;

/**
 * @override update()
 */
Cobalt.Website.Data.VehicleResultsDataManagerClass.prototype.update = function()
{
    if ("__RESULTS_VEHICLE_DATA" in window)
    {
        this.setJsonData(__RESULTS_VEHICLE_DATA);
    }
};

Cobalt.Website.Data.VehicleResultsDataManagerClass.prototype.getVehicleIdByResultDomElement = function(element)
{
	var sandbox = this.sandbox;
    var parent = sandbox.dom(element).parents("li[id^='result_item_']");
    if (sandbox.dom(parent).length() !== 1) { return null;}
    var dataContainingId = sandbox.dom(parent).attr("id");
    if (!dataContainingId) {return null; }
    var dataContainingIdArray = dataContainingId.split("_");
    if (dataContainingIdArray.length === 3)
    {
        return dataContainingIdArray[2];
    }

    return null;
};

Cobalt.Website.Data.VehicleResultsDataManagerClass.prototype.getVehicleDataByVehicleId = function(vehicleId)
{
    if (!vehicleId) { return; }

    try
    {
        if (!this.getJsonData().Results) { return; }
        return this.getJsonData().Results[vehicleId];
    }
    catch(e)
    {
        return null;
    }
};

Cobalt.Website.Data.VehicleResultsDataManagerClass.prototype.getVINByVehicleId = function(vehicleId)
{
    var data = this.getVehicleDataByVehicleId(vehicleId);
    if (!data) { return; }
    return data.vin;
};


/**
 *
 *  Vehicle Detail Data manager
 * 
 */
Cobalt.Website.Data.VehicleDetailDataManagerClass = function(sandbox)
{
    Cobalt.Website.Data.ManagerClass.call(this); //call base constructor
	this.sandbox = sandbox;
};
Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype = new Cobalt.Website.Data.ManagerClass();
Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.superClass = Cobalt.Website.Data.ManagerClass.prototype;

Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.update = function()
{
    if ("mediaJSON" in window)
    {
        this.setJsonData(mediaJSON);
    }
};
Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.getWebId = function()
{
    return this.getJsonData().data.webId;
};
Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.getYear = function()
{
    return this.getJsonData().data.year;
};
Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.getMake = function()
{
    return this.getJsonData().data.make;
};
Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.getModel = function()
{
    return this.getJsonData().data.model;
};
Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.getTrim = function()
{
    return this.getJsonData().data.trim;
};

Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.getAllPhotos = function()
{
    return this.getJsonData().data.allPhotos;
};

Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.getVideos = function()
{
    return this.getJsonData().data.video;
};

Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.isAutoPlayPhoto = function()
{
	var photosData = this.getJsonData().data.allPhotos;
	return (photosData)? photosData.show : false;
};

/**
 * isAutoPlayVideo is not "show = true"
 */
Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.isAutoPlayVideo = function()
{
	var videoData = this.getJsonData().data.video;
	return (videoData)? videoData.autoPlay : false;
};

Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.isShowVideo = function()
{
	var videoData = this.getJsonData().data.video;
	return (videoData)? videoData.show : false;
};

Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.getVehicleId = function()
{
    var data = this.getJsonData().data;

    if (data)
    {
        return data.vehicleId
    }

	throw new Error("VD dataManager => no vehicleID");
};

Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.getVin = function()
{
	var data = this.getJsonData().data;
    if (data)
    {
        return data.vin;
    }
	throw new Error("VD dataManager => no Vin");
};

Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.getPageLabel = function()
{
	var data = this.getJsonData().data;
    if (data)
    {
        return data.pageLabel;
    }
	throw new Error("VD dataManager => no pageLabel");
};

Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.getAccessoriesURL = function()
{
	var data = this.getJsonData().data;
    if (data)
    {
        return data.accessoriesUrl;
    }
	throw new Error("VD dataManager => no AccessoriesURL");
};

Cobalt.Website.Data.VehicleDetailDataManagerClass.prototype.getLocale = function()
{
	var data = this.getJsonData().data;
    if (data)
    {
        return data.locale;
    }
	throw new Error("VD dataManager => no locale");
};

    

