sportGroup = $sportGroup;
        $this->sport      = $sport;
    }
    function setSportsLevel($sportLevel)
    {
        $this->sportLevel = $sportLevel;
    }
    function getSportsRound()
    {
        return  $this->sportLevel;
    }
    function getHeaders()
    {
        return  $this->header;
    }
    function getMatrix()
    {
        return  $this->matrix;
    }
    function getReportLines()
    {
        return  $this->reportLines;
    }
    function isUsable()
    {
        return  $this->usable;
    }
    function getProblem()
    {
        return  $this->problem;
    }
    function setDecoratorLength($decoratorLen)
    {
        $this->decoratorLen = $decoratorLen;
    }
    function parseHeaders($line)
    {
        $this->reportLines[] = $line;
        
        $hAnalysis = new Lexicon($line);
        $hAnalysis->preAnalyse();
        $dictionary = Lexicon::getDictionary();
       
        $words = ParserUtility::getWords($line);        
        $count = 1;
        foreach($words as $word)
        {
            //echo '
~'.$word.'~IN~'.implode("#",$dictionary['HEADER-COL']) ;
            if(ParserUtility::in_array_i($dictionary['HEADER-COL'], $word)===false)
            {
                $this->usable = false;
                $this->problem = "Unknown Header ".$word; 
                $this->__resetObj();
                return;
            }
            $this->header[$count] = $word;
            $count++;
        }
        $this->headerCount = count($this->header);
       
        $previousHead = "SL";
        $this->headerPositions[$previousHead]['INDEX'] = 0;
        $this->headerPositions[$previousHead]['POSITION-START'] = 0;
        $this->headerPositions[$previousHead]['TEXT-END']       = strlen($previousHead);
        $this->headerPositions[$previousHead]['TEXT-LENGTH']    = strlen($previousHead);
        foreach($this->header as $head)
        {     
            if($this->debug) echo "
Header -  Parsing '".$head."' IN -> ".$line;       
            $stEnd      = ParserUtility::get_start_end_pos($line, $head);
            $startEnd   = $stEnd[0];
            //if($this->debug) { echo "
       POSITION - "; print_r($startEnd); }
            
           
            $this->headerPositions[$previousHead]['POSITION-END']       = $startEnd['START-POSITION']-1;
            $this->headerPositions[$previousHead]['POSITION-LENGTH']    = ($this->headerPositions[$previousHead]['POSITION-END'] - $this->headerPositions[$previousHead]['POSITION-START'])+1;
            
            $this->headerPositions[$head]['INDEX']                      = $this->headerPositions[$previousHead]['INDEX']+1;
            $this->headerPositions[$head]['POSITION-START']             = $startEnd['START-POSITION'];
            $this->headerPositions[$head]['TEXT-END']                   = $startEnd['END-POSITION'];
            $this->headerPositions[$head]['TEXT-LENGTH']                = $startEnd['LENGTH'];
            $previousHead = $head;
            
            if($this->debug) echo "
Header -  Set position data of '".$head."' ";
            if($this->debug) echo "
:::::::::::::::::::::::::::::
";
        }
        $this->headerPositions[$previousHead]['POSITION-END']       = $this->decoratorLen;
    }
    function parseData($line)
    {
        $this->reportLines[] = $line;
        if($this->usable)
        {
            $hAnalysis = new Lexicon($line);
            $hAnalysis->analyse();
            $words = ParserUtility::getWords($line);        
            
            if($this->debug) echo "
Line -  Operating on '".$line."' which is >>".$hAnalysis->getGeneralContext();
            
            if($hAnalysis->getGeneralContext() == 'SPORTS-ROUND')
            {
                $this->sportLevel = $hAnalysis->getSportsRound();
                if($this->debug) echo "
 SETTING SPORTS-ROUND >> '".$hAnalysis->getSportsRound()."'";
                if($this->debug) echo "
---------------------------------
";
            }   
            else
            {
                $headerIndex    = 0;
                $incrementRow   = true;
                $hasSL          = false;
                $wordStEnd      = ParserUtility::get_start_end_pos($line, $words[0]);
                if(@$wordStEnd[0]['END-POSITION']<=@$this->headerPositions['SL']['POSITION-END'] 
                    && @$wordStEnd[0]['END-POSITION']>@$this->headerPositions['SL']['POSITION-START'])
                {
                    $hasSL      = true;
                }
                foreach($words as $indx=>$wrd)
                {
                    $word = ' '.$wrd.' ';
                    if($this->debug) echo "
Line -  Parsing '".$word."' IN -> ".$line." for ".$this->sportGroup;  
                    
                    switch($this->sportGroup)
                    {
                        case ParserUtility::$_RUNNING_ :                           
                        case ParserUtility::$_RELAY_ :                            
                            if($hasSL===true)
                            {
                                $headerIndex = $this->__processRowFor_jump($indx, $word, $line, $headerIndex);
                                if($headerIndex<0)
                                {
                                    $this->__processRowFor_addnlData($indx, $word, $line, $headerIndex);
                                    $incrementRow = false;
                                }
                            }
                            else
                            {
                               $this->__processRowFor_addnlData($indx, $word, $line, $headerIndex);
                               $incrementRow = false;
                            }
                            break;
                        case ParserUtility::$_JUMPING_ :   
                        case ParserUtility::$_JUMPING_TEAM_ :                        
                            if($hasSL===true)
                            {
                                $headerIndex = $this->__processRowFor_jump($indx, $word, $line, $headerIndex);
                                if($headerIndex<0)
                                {
                                    $this->__processRowFor_addnlData($indx, $word, $line, $headerIndex);
                                    $incrementRow = false;
                                }
                            }
                            else
                            {
                                $this->__processRowFor_addnlData($indx, $word, $line, $headerIndex);
                                $incrementRow = false;
                            }
                            break;
                        case ParserUtility::$_THROWING_ :
                        case ParserUtility::$_THROWING_TEAM_ :
                            if($hasSL===true)
                            {
                                $headerIndex = $this->__processRowFor_throw($indx, $word, $line, $headerIndex);
                                if($headerIndex<0)
                                {
                                    $this->__processRowFor_addnlData($indx, $word, $line, $headerIndex);
                                    $incrementRow = false;
                                }
                            }
                            else
                            {
                                $this->__processRowFor_addnlData($indx, $word, $line, $headerIndex);
                                $incrementRow = false;
                            }
                            break;
                        default :
                            $this->usable = false;
                            $this->problem = "PARSER NOT IMPLEMENTED"; 
                            $this->__resetObj();
                            break;
                    }
                }
                $this->__processCombinatorData();
                $this->prc = $this->rowCounter;
                $this->rowCounter++;                
            }
            
            if($this->debug) echo "
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
";
        }
    }
    function __processRowFor_addnlData($indx, $word, $line, $hIndex)
    {        
        $this->matrix[$this->prc]['ADDTIONAL-DATA'][$line]['COMBINATOR'][] = $word;
    }
    function __processRowFor_run($indx, $word, $line, $hIndex)
    {
        return $this->__pattern1($indx, $word, $line, $hIndex);
    }
    function __processRowFor_jump($indx, $word, $line, $hIndex)
    {
        return $this->__pattern1($indx, $word, $line, $hIndex);
    }
    
    function __processRowFor_throw($indx, $word, $line, $hIndex)
    {
        return $this->__pattern1($indx, $word, $line, $hIndex);
    }
    function __pattern1($indx, $word, $line, $hIndex)
    {
        $wordStEnd      = ParserUtility::get_start_end_pos($line, $word);
        if(sizeof($wordStEnd)==0)
        {
            $wordStEnd      = ParserUtility::get_start_end_pos($line, ' '.trim($word));
        }
        if(sizeof($wordStEnd)==0)
        {
            $wordStEnd      = ParserUtility::get_start_end_pos($line, trim($word).' ');
        }
        $headerIndex    = -1;
        if($this->debug) { echo "
       POSITION - "; print_r($wordStEnd); }
        if($this->debug) { echo "
       HEADER - "; print_r($this->headerPositions); }
        if($indx==0 
            && @$wordStEnd[0]['END-POSITION']<=$this->headerPositions['SL']['POSITION-END'] 
            && @$wordStEnd[0]['END-POSITION']>$this->headerPositions['SL']['POSITION-START'])//&& is_numeric(trim($word))===true 
        {
            $this->matrix[$this->rowCounter]['RAW-LINE']["COMBINATOR"][0] = trim($line);
            $this->matrix[$this->rowCounter]['ROUND']["COMBINATOR"][0] = $this->getSportsRound();
            $this->matrix[$this->rowCounter]["SL"]["COMBINATOR"][0] = trim($word);
            if($this->debug) echo "
 Putting '".$word."' AT -> SL";
            if($this->debug) echo "
---------------------------------
";
        }
        else if(isset($this->matrix[$this->rowCounter]['SL']))
        {
            foreach($wordStEnd as $wordStartEnd)
            {
                if($wordStartEnd['END-POSITION']<=$this->decoratorLen)
                {
                    $headerIndex = 0;
                    foreach($this->headerPositions as $header=>$headerPos)
                    {
                        if($this->debug) echo "
 Matching end 'w-".$wordStartEnd['END-POSITION']."' between 'h-".$headerPos['POSITION-START']."' and 'h-".$headerPos['POSITION-END']."' @ ".$header.' HAVING hIndex=>'.$hIndex;
                        if($wordStartEnd['END-POSITION']<=$headerPos['POSITION-END'] 
                            && $wordStartEnd['END-POSITION']>$headerPos['POSITION-START']
                            && $headerIndex >= $hIndex)
                        {
                            if($this->debug) echo "
 -- Success Matching 'w-".$wordStartEnd['END-POSITION']."' with 'h-".$headerPos['POSITION-END']."' and 'w-".$wordStartEnd['END-POSITION']."' with 'h-".$headerPos['POSITION-START']."' @ ".$header.' HAVING hIndex=>'.$hIndex.'';
                            $this->matrix[$this->rowCounter][$header]['COMBINATOR'][] = trim($word);
                            if($this->debug) echo "
Line -  Putting '".$word."' AT -> ".$header;
                            if($this->debug) echo "
---------------------------------
";
                            
                            if(count($wordStEnd)>1)
                            {
                                $headerIndex++;
                            }
                            return $headerIndex; 
                        }
                        elseif(($wordStartEnd['END-POSITION']-$headerPos['POSITION-END'])==1)
                        {
                            if($this->debug) echo "
 -- Force Matching 'w-".$wordStartEnd['END-POSITION']."' with 'h-".$headerPos['POSITION-END']."' and 'w-".$wordStartEnd['END-POSITION']."' with 'h-".$headerPos['POSITION-START']."' @ ".$header.'';
                            $this->matrix[$this->rowCounter][$header]['COMBINATOR'][] = trim($word);
                            if($this->debug) echo "
Line -  Putting '".$word."' AT -> ".$header;
                            if($this->debug) echo "
---------------------------------
";
                            return $headerIndex; 
                        }
                        $headerIndex++;
                    }
                }
                else
                {   
                    //echo "IN~".$word.' >> '.$line;
                    $this->matrix[$this->rowCounter]['REMARKS']['COMBINATOR'][] = trim($word);
                }
            }
        }
        return $headerIndex; 
    }
    function __processCombinatorData()
    {
        if(is_array($this->matrix) && sizeof($this->matrix) > 0)
        {
            if(is_array(@$this->matrix[$this->rowCounter]))
            {                
                foreach($this->matrix[$this->rowCounter] as $header=>$rowData)
                {
                    if($header==='ADDTIONAL-DATA')
                    {
                        $toDelete = array();
                        $cntr = 0;
                        foreach($this->matrix[$this->rowCounter]['ADDTIONAL-DATA'] as $lnn=>$addlnRec)
                        {
                            $this->matrix[$this->rowCounter]['ADDTIONAL-DATA'][$cntr]["COMBINATOR"] = $addlnRec['COMBINATOR'];
                            $this->matrix[$this->rowCounter]['ADDTIONAL-DATA'][$cntr]["COMBINED"] = implode(" ",$addlnRec['COMBINATOR']);                            
                            $cntr++;
                            $toDelete[] = $lnn;
                        }
                        foreach($toDelete as $lndl)
                        {
                            unset($this->matrix[$this->rowCounter]['ADDTIONAL-DATA'][$lndl]);
                        }
                    }
                    else
                    {
                        if(is_array(@$rowData['COMBINATOR']))
                        {
                            $this->matrix[$this->rowCounter][$header]["COMBINED"] = implode(" ",$rowData['COMBINATOR']);
                            if(strtolower($header)==='name')
                            {
                                $analysis = new Lexicon(implode(" ",$rowData['COMBINATOR']));
                                $nameAnalysis = $analysis->getAnalysisForNames();
                                $this->matrix[$this->rowCounter][$header]["COMBINED"]   = @$nameAnalysis['FULL-NAME'];
                                $this->matrix[$this->rowCounter][$header]["ROLL-NO"]    = @$nameAnalysis['ROLL-NO'];
                                $this->matrix[$this->rowCounter][$header]["FIRST-NAME"] = @$nameAnalysis['FIRST-NAME'];
                                $this->matrix[$this->rowCounter][$header]["LAST-NAME"]  = @$nameAnalysis['LAST-NAME'];
                            }
                        }
                    }
                }
            }
            switch($this->sportGroup)
            {
                case ParserUtility::$_RUNNING_ :
                case ParserUtility::$_RELAY_ :
                    $this->__processDataFor_run();
                    break;
                case ParserUtility::$_JUMPING_ :
                case ParserUtility::$_JUMPING_TEAM_ :                        
                    $this->__processDataFor_jump();
                    break;
                case ParserUtility::$_THROWING_ :
                case ParserUtility::$_THROWING_TEAM_ :
                    $this->__processDataFor_throw();
                    break;
                default :                   
                    break;
            } 
        }
    }
    function __processDataFor_run()
    {
        if(is_array(@$this->matrix[$this->rowCounter]))
        {
            foreach($this->matrix[$this->rowCounter] as $header=>$rowData)
            {
                $rec = @ParserUtility::$terms_reportHeader_dType[$header];
                switch($rec)
                {
                    case "string":
                        $this->matrix[$this->rowCounter][$header]["DATA"] = $rowData['COMBINED'];
                        break;
                    case "int":
                        $this->matrix[$this->rowCounter][$header]["DATA"] = $rowData['COMBINED'];  
                        
                        if(strpos(strtoupper($rowData['COMBINED']),"Q")!==false)
                        {           
                            $this->matrix[$this->rowCounter]["MARK"]["DATA"] = "QUALIFIED"; 
                        }  
                        $this->matrix[$this->rowCounter][$header]["COMBINED"] =  ParserUtility::removeAlphabetsOnly($rowData['COMBINED']);
                        break;
                    case "float":                    
                        if(trim( $rowData['COMBINED'])!=='')
                        {
                            if(strpos(strtoupper($rowData['COMBINED']),"Q")!==false)
                            {           
                                $this->matrix[$this->rowCounter]["MARK"]["DATA"] = "QUALIFIED"; 
                            }
                            $this->matrix[$this->rowCounter][$header]["COMBINED"] =  ParserUtility::removeAlphabetsOnly($rowData['COMBINED']);
                            if(strpos($rowData['COMBINED'],":"))
                            {
                                $calcData = ParserUtility::numerizeTime($rowData['COMBINED']);
                                $this->matrix[$this->rowCounter][$header]["DATA"] = $calcData;
                            }
                            else
                            {
                                $this->matrix[$this->rowCounter][$header]["DATA"] = floatval($rowData['COMBINED']);   
                            }
                        }
                        break;
                    default:
                        if($header!=='ADDTIONAL-DATA')
                        {
                            $this->matrix[$this->rowCounter][$header]["DATA"] = $rowData['COMBINED']; 
                        }
                        break;
                }
            }
        }
    }
    function __processDataFor_jump()
    {
        if(is_array(@$this->matrix[$this->rowCounter]))
        {
            foreach($this->matrix[$this->rowCounter] as $header=>$rowData)
            {
                $rec = @ParserUtility::$terms_reportHeader_dType[$header];
                switch($rec)
                {
                    case "string":
                        $this->matrix[$this->rowCounter][$header]["DATA"] = $rowData['COMBINED'];
                        break;
                    case "int":
                        $this->matrix[$this->rowCounter][$header]["DATA"] = $rowData['COMBINED'];  
                        if(strpos(strtoupper($rowData['COMBINED']),"Q")!==false)
                        {           
                            $this->matrix[$this->rowCounter]["MARK"]["DATA"] = "QUALIFIED";                              
                        }    
                        $this->matrix[$this->rowCounter][$header]["COMBINED"] =  ParserUtility::removeAlphabetsOnly($rowData['COMBINED']);                              
                        break;
                    case "float":                    
                        if(trim( $rowData['COMBINED'])!=='')
                        {
                            if(strpos(strtoupper($rowData['COMBINED']),"Q")!==false)
                            {           
                                $this->matrix[$this->rowCounter]["MARK"]["DATA"] = "QUALIFIED";                                   
                            }
                            $theData = ParserUtility::removeAlphabetsOnly($rowData['COMBINED']);
                            $this->matrix[$this->rowCounter][$header]["COMBINED"] = $theData ;
                            if(strpos($theData,"-"))
                            {
                                $calcData = ParserUtility::numerizeLength($theData);
                                $this->matrix[$this->rowCounter][$header]["DATA"] = $calcData;
                            }
                            else
                            {
                                $this->matrix[$this->rowCounter][$header]["DATA"] = $rowData['COMBINED'];   
                            }                            
                        }
                        break;
                    default:
                        if($header!=='ADDTIONAL-DATA')
                        {
                            $this->matrix[$this->rowCounter][$header]["DATA"] = $rowData['COMBINED']; 
                        }
                        break;
                }
            }
        }
    }
    function __processDataFor_throw()
    {
        if(is_array(@$this->matrix[$this->rowCounter]))
        {
            foreach($this->matrix[$this->rowCounter] as $header=>$rowData)
            {
                $rec = @ParserUtility::$terms_reportHeader_dType[$header];
                switch($rec)
                {
                    case "string":
                        $this->matrix[$this->rowCounter][$header]["DATA"] = $rowData['COMBINED'];
                        break;
                    case "int":
                        $this->matrix[$this->rowCounter][$header]["DATA"] = $rowData['COMBINED'];     
                        if(strpos(strtoupper($rowData['COMBINED']),"Q")!==false)
                        {           
                            $this->matrix[$this->rowCounter]["MARK"]["DATA"] = "QUALIFIED";                             
                        }  
                        $this->matrix[$this->rowCounter][$header]["COMBINED"] =  ParserUtility::removeAlphabetsOnly($rowData['COMBINED']);                             
                        break;
                    case "float":                    
                        if(trim( $rowData['COMBINED'])!=='')
                        {
                            if(strpos(strtoupper($rowData['COMBINED']),"Q")!==false)
                            {           
                                $this->matrix[$this->rowCounter]["MARK"]["DATA"] = "QUALIFIED";  
                            }
                            $this->matrix[$this->rowCounter][$header]["COMBINED"] =  ParserUtility::removeAlphabetsOnly($rowData['COMBINED']);
                            if(strpos($rowData['COMBINED'],"-"))
                            {
                                $calcData = ParserUtility::numerizeLength($rowData['COMBINED']);
                                $this->matrix[$this->rowCounter][$header]["DATA"] = $calcData;
                            }
                            else
                            {
                                $this->matrix[$this->rowCounter][$header]["DATA"] = $rowData['COMBINED'];   
                            }
                        }
                        break;
                    default:
                        if($header==='ADDTIONAL-DATA')
                        {
                        }
                        else
                        {
                            $this->matrix[$this->rowCounter][$header]["DATA"] = $rowData['COMBINED']; 
                        }
                        break;
                }
            }
        }
    }
    function __resetObj()
    {        
        $this->decoratorLen     = 0;
        $this->header           = array();
        $this->headerCount      = 0;
        $this->headerPositions  = array();
        $this->matrix         = array();
        $this->rowCounter     = 0;
    }
}
?>