function TourUtils() {
    return;
}
TourUtils.prototype.openerWindow = function(_url) {
    if (window.opener && window.opener.closed == false) {
        window.opener.location.href = _url;
    }
    else {
        window.open(_url);
    }
}
TourUtils.prototype.play = function(_video_id) {
    try {
        window.tourLiveAtVideoPlayer.videoPlayer.playVideo(_video_id); 
    } catch(e) { }
}
TourUtils.prototype.playLiveStream = function() {
    try {
        window.tourLiveAtVideoPlayer.videoPlayer.playLiveStream(); 
    } catch(e) { }
}
TourUtils.prototype.writeLIVEatTitle = function(_tourName, _tourTitleImg) {
    var LIVEat_TitleRef = document.getElementById("tourTitle");
    titleImageNode = document.createElement("img");
    with (titleImageNode) {
        setAttribute("src", _tourTitleImg);
        setAttribute("alt", _tourName);
        setAttribute("title", "");
    }
    LIVEat_TitleRef.appendChild(titleImageNode);
    
    
}

TourUtils.prototype.initializeADs = function() {
    initializeAds();
}

TourUtils.prototype.writeLIVEatTab = function(_holeID) {
    var LIVEat_TabRef = document.getElementById("mainTab1");
    var LIVEat_TabText = "LIVE@ THE ";
    var LIVEat_OrdinalText;
    
    switch (parseInt(_holeID)) {
        case 1:
        LIVEat_OrdinalText = "ST";
        break;
        case 2:
        LIVEat_OrdinalText = "ND";
        break;
        case 3:
        LIVEat_OrdinalText = "RD";
        break;
        default:
        LIVEat_OrdinalText = "TH";
        break;
    }
    LIVEat_TabText += _holeID + LIVEat_OrdinalText;
    LIVEat_TabRef.innerHTML = LIVEat_TabText;
}
TourUtils.prototype.startVideo = function() {
    document.getElementById("tourLiveAtVideoPlayer").src = "/.element/apps/liveat/3.0/sect/videoPlayer.html";
}

tour = new TourUtils();
var videoPlayer;

function tourLiveAtController(_oTimeInitProps) {
    var timer;
    var cDatas;
    var cComponents;
    var oTimer;
    var iTimerId;
    var oJicTimer;
    var iJicTimerId;
    var oVideoTimer;
    var iVideoTimerId;	
    var MILLISECONDS_BETWEEN_DATA_REFRESH;
    var MILLISECONDS_TO_DELAY_DURING_STARTUP;
    var MAX_MILLISECONDS_TO_DELAY_DATA_REFRESH;
    var iDataObjectsLoaded;
    var TOURNAMENT_CURRENT_ROUND;
    var IS_POLLING_ALLOWED;
    var initialized = false;
    
    this.ready_state = 0;
    this.CUSTOM_PLAYER_COOKIE_NAME = "tourLiveAtCustomPlayers_" + tourLiveAtProperties.tournament.id;
    this.MSIE_BROWSER = setBrowser();
    
    init();
    
    function init() {
        cComponents = new Array();
        cDatas = new Array();
        iDataObjectsLoaded = 0;
        iTimerId = 1;
        iJicTimerId = 2;
        MILLISECONDS_BETWEEN_DATA_REFRESH = _oTimeInitProps.poll;
        MILLISECONDS_TO_DELAY_DURING_STARTUP = _oTimeInitProps.delayonstartup;
        MAX_MILLISECONDS_TO_DELAY_DATA_REFRESH = _oTimeInitProps.max;
        IS_POLLING_ALLOWED = isPollingAllowed(_oTimeInitProps.date_startpolling, _oTimeInitProps.date_stoppolling);
    }
    
    function isPollingAllowed(_tourStartDate, _tourEndDate) {
        var isPollingAllowed_;
        var tourStartTime = new Date(_tourStartDate).getTime();
        var tourEndTime = new Date(_tourEndDate).getTime();
        var currentTime = new Date().getTime();
        
        isPollingAllowed_ = (tourStartTime < currentTime && tourEndTime > currentTime)? true : false;
        
        return isPollingAllowed_;
    }
    function setBrowser() {
        var agent = navigator.userAgent.toLowerCase();
        if (agent.indexOf('msie') > -1) { return true; }
        
        return false;	
    }
    
    this.config = function(_components) {
        var iComponentIndex;
        var iComponentDataHandler;
        
        // Initialize Components
        for (var i=0; i<_components.length; i++) {
                
            if (_components[i].type != 4) { 
                this.initializeComponent(_components[i]);
            }
        }
        
        // Add Controller as a Listerner to each dataobject.
        for (var i = 0; i < cDatas.length; i++) {
            cDatas[i].addObserver(this);
        }
    }
    
    this.configLayoutComponents = function(_layout_components) {
        var layoutcompListLength;
        var domRef;
        var ajaxRequestHandler;
        
        layoutcompListLength = _layout_components.length;
        for (var i=0; i<layoutcompListLength; i++) {
            try {
                lc_dom_ref = _layout_components[i].dom_id;
                ajaxRequestHandler = new Ajax.Request(_layout_components[i].url, {
                    onSuccess : function(_response, lc_dom_ref) {
                        document.getElementById(_layout_components[i].dom_id).innerHTML = _response.responseText;
                    },
                    onFailure : function(_response) {
                        alert(_response.responseText);
                    },
                    asynchronous: false,
                    method: 'get'
                });
            } catch (e) { 
            continue;
        }
    }
}

/**
* Creates the DataObject that acts as a DataSource for linked Component.
*
* @param 	_componentId		The ID of the component interested in associating a DataObject with itself.
* @param	_componentDataUrl	Relative URL of the DataSource.
* @return 						The Array Index of the created DataObject
*/
function initializeData(_componentId, _componentData) {
    var dataObjIndex_;
    
    for (var i=0; i<cDatas.length; i++) {
        if (cDatas[i].getDataUrl() == _componentData.datasrc) {
            cDatas[i].addObserver(cComponents[_componentId]);
            return i;
        }
    }
    dataObjIndex_ = cDatas.length;		
    cDatas[dataObjIndex_] = new TourLiveAtData(dataObjIndex_, _componentData);
    cDatas[dataObjIndex_].addObserver(cComponents[_componentId]);
    
    return dataObjIndex_;
}

function populateData() {
    for (var i = 0; i < cDatas.length; i++) {
        //alert(i + " " + cDatas[i].isRunningAutoPopulateMode());
        if (cDatas[i].isRunningAutoPopulateMode() == true) {
            cDatas[i].retrieveData();
        } 
        else { ++iDataObjectsLoaded; }
    }
}

this.initializeComponent = function(_component, _componentName) {
    var oComponentProps;
    var componentIndex;
    
    if (_component != null) {
        oComponentProps = _component;
    }
    else if (_componentName != null) {
        for (var i=0; i<tourLiveAtProperties.components.length; i++) {
            if (tourLiveAtProperties.components[i].name == _componentName) {
                oComponentProps = tourLiveAtProperties.components[i];
            }
        }			
    }
    else { return; }
    
    componentIndex = cComponents.length;
    switch (oComponentProps.type) {
        case 1 :
        cComponents[componentIndex] = eval('new ' + oComponentProps.name + 'Component(' + componentIndex + ', oComponentProps)');
        initializeData(componentIndex, oComponentProps.data);
        break;
        case 2 :
        cComponents[componentIndex] = eval('new ' + oComponentProps.name + 'Component(' + componentIndex + ', oComponentProps)');
        var dataObjId = initializeData(componentIndex, oComponentProps.data);
        cComponents[componentIndex].config(dataObjId, this, oComponentProps.user_interface);
        break;
        case 3 :
        cComponents[componentIndex] = eval('new ' + oComponentProps.name + 'Component(' + componentIndex + ', oComponentProps)');
        var dataObjId = initializeData(componentIndex, oComponentProps.data);
        cComponents[componentIndex].config(dataObjId, this, oComponentProps.user_interface, oComponentProps.datasrc);
        break;
        case 4 : // component is initialized by another object and cannot be observed by the controller.
        cComponents[componentIndex] = eval('new ' + oComponentProps.name + 'Component(' + componentIndex + ', oComponentProps)');
        var dataObjId = initializeData(componentIndex, oComponentProps.data);
        cComponents[componentIndex].config(dataObjId, this, oComponentProps.user_interface, oComponentProps.data.datasrc);
        return cComponents[componentIndex]; // interesting.......
        default : 
        break;
    }
}

// needs updating.
this.retrieveData = function(_dataObjId) {
    cDatas[_dataObjId].retrieveData();
}

this.updateComponent = function(_componentId) {
    for (var i=0; i < cComponents.length; i++) {
        if (cComponents[i].getId() == _componentId) {
            cComponents[i].render();
            break;
        }
    }
}

this.notify = function(_dataId, _dataObjId, _data, _code) {
    if (_code && _code == -1) { 
        if (this.ready_state == 0) { 
            tour.startVideo();  // the video timer initiates start of video.  Happens on error usually.
            this.ready_state = 2; // video started on error.
        }
        return; 
    }
    
    if (_dataObjId != null && cDatas[_dataObjId].isRunningAutoPopulateMode()) { ++iDataObjectsLoaded }
    else { return; }
    
    if (iDataObjectsLoaded == cDatas.length) { 
        try {
            clearTimeout(oJicTimer);
            clearTimeout(oTimer);
        }
        catch (e) {
            //alert("error clearing timeout");
        }
        
        if (IS_POLLING_ALLOWED == true) { this.run(); } 
        
        if (initialized == false) { 
            initialized = true;				
            if (this.ready_state != 2) {
                // Initiate Video Player with Live At Stream.
                tour.startVideo();
            }
            
            this.ready_state = 4;
        }
    } 
}

this.run = function(_sleepTime) {		
    var sleepTime = (_sleepTime != null)? _sleepTime : MILLISECONDS_BETWEEN_DATA_REFRESH;		
    
    oTimer = eval('setTimeout("tlac.awake()", sleepTime)');
    oJicTimer = eval('setTimeout("tlac.awake()", MAX_MILLISECONDS_TO_DELAY_DATA_REFRESH)');
}

this.updateVideoPlayer = function() {
    if (readCookie(videoplayer_cookie) == null) {
        VideoPlayer.playAd();
        oVideoTimer = setTimeout("tlac.updateVideoPlayer()", VIDEO_MILLISECONDS_BETWEEN_INTERRUPT); 
    }
}

this.awake = function(_timerId) {
    iDataObjectsLoaded = 0;
    populateData();
}

this.setAutoPopulateMode = function(_modeSwitch, _dataObjId) {
    var apModeSwitch;
    
    apModeSwitch = (_modeSwitch == "on")? true : false;
    cDatas[_dataObjId].setRunAutoPopulateMode(apModeSwitch); 
}

this.setDataObjUrl = function(_url, _dataObjId) {
    cDatas[_dataObjId].setDataUrlFromExtSrc(_url);
}

this.HandleUserInterface_OnClick = function(_componentId, _interfaceId) {
    cComponents[_componentId].HandleUserInterface_OnClick(_interfaceId);
}

this.HandleRefreshCustomLeaderBoard = function(_componentId, _newArr) {
    cComponents[3].update(_newArr);
    cComponents[_componentId].updatePlayers(_newArr);
}

this.transformLBXmlToJson = function(_xmlData, varName) {
    var jsonPlayerObjTmpl = new Template('{"id":"#{id}", "name":"#{name}"}#{comma}');
    var cPlayersMetaData = new Object();
    cPlayersMetaData.items = [ ];
    var tournamentId;
    var tournamentName;
    var playerElements = _xmlData.getElementsByTagName("player");
    var playerId;
    var playerName;
    var playersJson_;
    var commaVar = ",";
    var nodeIndexValue = 1;
    
    nodeIndexValue = (window.ActiveXObject)? 0 : 1; //QUICK BROWSER DETECT....
    
    tournamentId = _xmlData.documentElement.getAttribute("id");
    try { tournamentName = _xmlData.documentElement.childNodes[1].childNodes[0].nodeValue; }
    catch (e) { tournamentName = ""; }
    
    for (var i=0; i<playerElements.length; i++) { 
        playerId = playerElements[i].getAttribute("id");
        playerName = playerElements[i].childNodes[nodeIndexValue].childNodes[0].nodeValue;
        if ((i+1) == playerElements.length) { commaVar = ""; }
        cPlayersMetaData.items.push({id:playerId, name:playerName, comma:commaVar});
    }
    
    playersJson_ = '{"id":"' + tournamentID + '", "name":"' + tournamentName + '", "players":[';
    var playerData;
    for (var i=0; i<cPlayersMetaData.items.length; i++) {
        playerData = cPlayersMetaData.items[i];
        playersJson_ += jsonPlayerObjTmpl.evaluate(playerData);
    }
    playersJson_ += ']}';
    tourCustomPlayersObject = eval('(' + playersJson_ + ')');
}	
}

function initializeAds() {
    var oAdPropRef;
    var iAdIndex;
    var adRef;
    var adsListLength;
    
    adsListLength = tourLiveAtProperties.ads.length;
    for (var i=0; i<adsListLength; i++) {
        oAdPropRef = tourLiveAtProperties.ads[i];
        initAds(oAdPropRef);
    }
}

function initAds(_oAd) {
    var adtype;
    var iframeRef;
    switch (_oAd.type) {
        case 0: 
        document.getElementById(_oAd.adspace_id).src = _oAd.url;			
    }
}