// -------------------------------------------------
// Parses <ajax> XML
// -------------------------------------------------
function XmlParser(xmlDoc) {

    var rootNode = xmlDoc.getElementsByTagName("ajax")[0];
    var root = null;
    
    // -------------------------------------------------
    // check if this is an "empty" xml
    // -------------------------------------------------
    this.isEmpty = function() {
    
        var emptyNode = xmlDoc.getElementsByTagName("empty")[0];
        if (nodeExists(emptyNode)) {
            return true;
        } else {
            return false;
        }
        
    };

    // -------------------------------------------------
    // get parsed root object
    // -------------------------------------------------
    this.getRoot = function() {
    
        if (root == null) {
            root = new Object();
            parseRoot();
            parseResult();
            parseAnnotations();
            parseLineup();
            parseMatchHistory();
            parseSummary();
            parseLiveStats();
            parseTime();
        }   
            
        return root;
        
    };

    // -------------------------------------------------
    // parseRoot <ajax>
    // -------------------------------------------------
    function parseRoot() {

        if (!nodeExists(rootNode)) {
            return;
        }

        root.version = rootNode.attributes.getNamedItem("version").value;
        root.date = rootNode.attributes.getNamedItem("date").value;

    }
    // -------------------------------------------------
    // parseTime <ajax>
    // -------------------------------------------------
    function parseTime() {
        var timeNode = rootNode.getElementsByTagName("time")[0];

        if (!nodeExists(timeNode)) {
            return;
        }


        var time = new Object();

        time.min = timeNode.attributes.getNamedItem("min").value;
        time.update = timeNode.attributes.getNamedItem("update").value;
        time.status = timeNode.attributes.getNamedItem("status").value;
        time.period = timeNode.attributes.getNamedItem("period").value;

        root.time = time;
    }

    // -------------------------------------------------
    // parse result
    // -------------------------------------------------
    function parseResult() {
    
        var resultNode;
        // find result node
        for (var i = 0; i < rootNode.childNodes.length; i++) {
            var node = rootNode.childNodes[i];
            if (node.tagName == "result") {
                resultNode = node;
                break;
            }
        }
        
        if (!nodeExists(resultNode)) {
            return;
        }
        
        var result = new Object();
        
        result.home = resultNode.attributes.getNamedItem("home").value;
        result.away = resultNode.attributes.getNamedItem("away").value;
        
        root.result = result;
        
    }

    // -------------------------------------------------
    // parse annotations
    // -------------------------------------------------
    function parseAnnotations() {
    
        var node = rootNode.getElementsByTagName("annotations")[0]; 
    
        if (!nodeExists(node)) {
            return;
        }
            
        //var annotations = new Object();
        var annotations = new Array();
        
        var pos = 0;
        for (var i = 0; i < node.childNodes.length; i++) {
            var child = node.childNodes[i];

            // only process elements            
            if (child.nodeType != 1) {
                continue;
            }

            var annotation = new Object();
            annotation.time = child.attributes.getNamedItem("time").value;
            annotation.text = child.attributes.getNamedItem("text").value;
            annotation.type = child.attributes.getNamedItem("type").value;
            annotation.resulttype = child.attributes.getNamedItem("resulttype").value;
            //alert(annotation.time + "' " + annotation.text);
            annotations[pos] = annotation;
            pos++;
        } 
        
        root.annotations = annotations;   
        
    } // end function

    // -------------------------------------------------
    // parse lineups
    // -------------------------------------------------
    function parseLineup() {
    
        var lineupNode = rootNode.getElementsByTagName("lineup")[0]; 
    
        if (!nodeExists(lineupNode)) {
            return;
        }


        var lineup = new Object();

        lineup.syncId = lineupNode.attributes.getNamedItem("syncId").value;

        
        var homeNode = lineupNode.getElementsByTagName('home')[0];
        var awayNode = lineupNode.getElementsByTagName('away')[0];
        
        lineup.home = new Object();
        lineup.away = new Object();

        lineup.home.id = homeNode.attributes.getNamedItem("id").value;
        lineup.away.id = awayNode.attributes.getNamedItem("id").value;
               
        parsePlayers(homeNode, lineup.home);
        parsePlayers(awayNode, lineup.away);

        function parsePlayers(node, object) {
            var pos = 0;
            var players = new Array();

            for (var i = 0; i < node.childNodes.length; i++) {
                var playerNode = node.childNodes[i];
        
                // only process elements
                if (playerNode.nodeType != 1) {
                    continue;
                }


                var player = new Object();
                
                player.id = playerNode.attributes.getNamedItem("id").value;
                player.position = playerNode.attributes.getNamedItem("position").value;
                player.firstName = playerNode.attributes.getNamedItem("firstName").value;
                player.surName = playerNode.attributes.getNamedItem("surName").value;
                player.number = playerNode.attributes.getNamedItem("number").value;
                player.status = playerNode.attributes.getNamedItem("status").value;
                player.subst = playerNode.attributes.getNamedItem("subst").value;
                player.substTime = playerNode.attributes.getNamedItem("substTime").value;
                player.substPeriod = playerNode.attributes.getNamedItem("substPeriod").value;

                player.goals = playerNode.attributes.getNamedItem("goals").value;
        
                players[pos] = player;
                pos++;
            } // for

            object.players = players;

        } // function
        
        root.lineup = lineup;
    
    } // end function
    
    // -------------------------------------------------
    // parse match history
    // -------------------------------------------------
    function parseMatchHistory() {
    
        var lineupNode = rootNode.getElementsByTagName("lineup")[0]; 
    
        if (!nodeExists(lineupNode)) {
            return;
        }

        var resultsNode = lineupNode.getElementsByTagName("results")[0]; 
            
        var results = new Array();
        
        var pos = 0;
        for (var i = 0; i < resultsNode.childNodes.length; i++) {
            var resultNode = resultsNode.childNodes[i];
    
            // only process nodes
            if (resultNode.nodeType != 1) {
                continue;
            }
    
            var result = new Object();
            
            result.pNumber = resultNode.attributes.getNamedItem("pNumber").value;
            result.pName = resultNode.attributes.getNamedItem("pName").value;
            result.type = resultNode.attributes.getNamedItem("type").value;
            result.subType = resultNode.attributes.getNamedItem("subtype").value;
            result.time = resultNode.attributes.getNamedItem("time").value;
            result.value = resultNode.attributes.getNamedItem("value").value;
            result.period = resultNode.attributes.getNamedItem("period").value;

            results[pos] = result;
            pos++;            
        } // for    
    
        root.lineup.results = results;
        
    } // end function 
    
    // -------------------------------------------------
    // parse match history
    // -------------------------------------------------
    function parseSummary() {
    
        var summaryNode = rootNode.getElementsByTagName("summary")[0]; 
    
        if (!nodeExists(summaryNode)) {
            return;
        }
        
        var summary = new Object();
        
        summary.hTeam = summaryNode.attributes.getNamedItem("hTeam").value;
        summary.aTeam = summaryNode.attributes.getNamedItem("aTeam").value;

        summary.results = new Array();
        
        var pos = 0;
        for (var i = 0; i < summaryNode.childNodes.length; i++) {
            var resultNode = summaryNode.childNodes[i];
            var result = new Object();
            
            result.type = resultNode.attributes.getNamedItem("type").value;
            result.value = resultNode.attributes.getNamedItem("value").value;
            
            summary.results[pos] = result;
            pos++;
        }
            
        root.summary = summary;    
            
    } // end function
    
//    // -------------------------------------------------
//    // parse live stats
//    // -------------------------------------------------
//    function parseLiveStats() {
//        var liveStatsNode = rootNode.getElementsByTagName("livestats")[0];
//
//        if (!nodeExists(liveStatsNode)) {
//            return;
//        }
//
//        var liveStats = new Object();
//
//        var homeNode = liveStatsNode.getElementsByTagName('home')[0];
//        var awayNode = liveStatsNode.getElementsByTagName('away')[0];
//
//        liveStats.home = new Object();
//        liveStats.away = new Object();
//
//        parseStats(homeNode, liveStats.home);
//        parseStats(awayNode, liveStats.away);
//
//        function parseStats(node, object) {
//            var nextGoalNode = node.getElementsByTagName('nextGoal')[0];
//            var nextCardNode = node.getElementsByTagName('nextCard')[0];
//            var outcomeNode = node.getElementsByTagName('outcome')[0];
//
//            var nextGoal = new Object();
//            nextGoal.home = parseFloat(nextGoalNode.attributes.getNamedItem("home").value);
//            nextGoal.away = parseFloat(nextGoalNode.attributes.getNamedItem("away").value);
//            nextGoal.none = parseFloat(nextGoalNode.attributes.getNamedItem("none").value);
//
//            var nextCard = new Object();
//            nextCard.home = parseFloat(nextCardNode.attributes.getNamedItem("home").value);
//            nextCard.away = parseFloat(nextCardNode.attributes.getNamedItem("away").value);
//            nextCard.none = parseFloat(nextCardNode.attributes.getNamedItem("none").value);
//
//            var outcome = new Object();
//            outcome.win = parseFloat(outcomeNode.attributes.getNamedItem("win").value);
//            outcome.draw = parseFloat(outcomeNode.attributes.getNamedItem("draw").value);
//            outcome.loss = parseFloat(outcomeNode.attributes.getNamedItem("loss").value);
//
//            object.nextGoal = nextGoal;
//            object.nextCard = nextCard;
//            object.outcome = outcome;
//        }
//
//        root.liveStats = liveStats;
//
//    } // end function
    
    // -------------------------------------------------
    // parse live stats
    // -------------------------------------------------
    function parseLiveStats() {
        var liveStatsNode = rootNode.getElementsByTagName("livestats")[0];

        if (!nodeExists(liveStatsNode)) {
            return;
        }

        var liveStats = new Object();

        parseStats(liveStatsNode, liveStats);

        function parseStats(node, object) {
            var nextGoalNode = node.getElementsByTagName('nextGoal')[0];
            var outcomeNode = node.getElementsByTagName('outcome')[0];

            var nextGoal = new Object();
            nextGoal.home = parseFloat(nextGoalNode.attributes.getNamedItem("home").value);
            nextGoal.away = parseFloat(nextGoalNode.attributes.getNamedItem("away").value);
            nextGoal.none = parseFloat(nextGoalNode.attributes.getNamedItem("none").value);

            var outcome = new Object();
            outcome.win = parseFloat(outcomeNode.attributes.getNamedItem("win").value);
            outcome.draw = parseFloat(outcomeNode.attributes.getNamedItem("draw").value);
            outcome.loss = parseFloat(outcomeNode.attributes.getNamedItem("loss").value);

            object.nextGoal = nextGoal;
            object.outcome = outcome;
        }

        root.liveStats = liveStats;

    } // end function

    // -------------------------------------------------
    // Check if node exists
    // -------------------------------------------------
    function nodeExists(node) {
        return typeof node != 'undefined' && node != null;
    }
    
}




// -------------------------------------------------
// Parses <games> XML
// -------------------------------------------------
function GamesXmlParser(xmlDoc) {

    var gamesNode = xmlDoc.getElementsByTagName("games")[0];
    var games = null;
    

    // -------------------------------------------------
    // get parsed games object
    // -------------------------------------------------
    this.getGames = function() {
    
        if (games == null) {
            parseGame();
        }   
            
        return games;
        
    };

    
    // -------------------------------------------------
    // parse <game>
    // -------------------------------------------------
    function parseGame() {

        games = new Array();                
    
        var pos = 0;    
        for (var i = 0; i < gamesNode.childNodes.length; i++) {
            var gameNode = gamesNode.childNodes[i];

            // only process elements
            if (gameNode.nodeType != 1) {
                continue;
            }

            var game = new Object();
            game.home = new Object();
            game.away = new Object();

            game.id = gameNode.attributes.getNamedItem("id").value;
            
            var homeNode = gameNode.getElementsByTagName('home')[0];
            var awayNode = gameNode.getElementsByTagName('away')[0];
                                                                      
            game.home.name = homeNode.attributes.getNamedItem("name").value;
            game.home.sname = homeNode.attributes.getNamedItem("sname").value;
            game.home.score = homeNode.attributes.getNamedItem("score").value;
            game.home.id = homeNode.attributes.getNamedItem("id").value;

            game.away.name = awayNode.attributes.getNamedItem("name").value;
            game.away.sname = awayNode.attributes.getNamedItem("sname").value;
            game.away.score = awayNode.attributes.getNamedItem("score").value;
            game.away.id = awayNode.attributes.getNamedItem("id").value;

            games[pos] = game;
            pos++;
        }

    } // end function
    
    // -------------------------------------------------
    // Check if node exists
    // -------------------------------------------------
    function nodeExists(node) {
        return typeof node != 'undefined' && node != null;
    }
    
}
