var RESULT_DIV_ID = 'resultDiv';
var UPDATE_FORM_NAME = 'UpdForm';
var UPDATE_INTERVAL = 60*1000; //время между одновлениями
var COOKIE_LIFE_TIME = 3*24*60*60*1000; //время жизни куков
var ds = new DataStore();
function DataStore(){
    this.lastUpdate = getUTCTime()-UPDATE_INTERVAL; //время последнего обновления в формтае UTC
    this.lastUpdateByServer = 0;
    this.isArchive = false;
    this.lastChangeTime = 0;
    this.lastChangeTimeFromOffice = 0;
    this.sports = new Array();
    this.sections = new Array();
    this.eventSectMap = new Array();  //карта соотвествий событий секциям
    this.events = new Array();
    this.clearAll = function(){
        this.sports = new Array();
        this.sections = new Array();
        this.events = new Array();
    }

    this.clearPage = function(){
        this.lastUpdate = getUTCTime()-UPDATE_INTERVAL;
        this.lastUpdateByServer = 0;
        this.isArchive = false;
        this.lastChangeTime = 0;
        this.sports = new Array();
        this.sections = new Array();
        this.eventSectMap = new Array();
        this.events = new Array();

        up.updatePage();
        this.updateTable();
    }
    this.storeSport = function(obj){
        this.sports[obj.sportId] = obj
    }
    this.storeSection = function(obj){
        //очистка карты секций-событий от старого содержимого
        if(this.sections[obj.sectId] != null){
            var oldObj = this.sections[obj.sectId];
            if(oldObj != null) for(var i=0; i < oldObj.eventIds.length; i++){
                this.eventSectMap[oldObj.eventIds[i]] = null;
            }
        }
        //alert('sport = ' +obj.sportId + '; section = '+ obj.sectId+';  '+obj.name);
        this.sections[obj.sectId] = obj;
        //заполенение карты событий-секций
        for(var i=0; i < obj.eventIds.length; i++){
            this.eventSectMap[obj.eventIds[i]] = obj.sectId;
        }
    }
    this.getEvent = function(evtId){
        return this.events[evtId];
    }
    this.storeEvent = function(obj){
        this.events[obj.eventId] = obj;
    }
    this.getSport = function(id){
        if(this.sports[id] == null){
            this.storeSport(new Sport(id, TXT_UNKNOWN_SPORT));
        }
        return this.sports[id];
    }
    this.getHTML = function(){
        var str = '<table id="resultTable">';
        str += '<tr class="tableCaption">';
        str += '<th>'+TXT_RES_TABLE_CAPTION_NUM+'</th>';
        str += '<th>'+TXT_RES_TABLE_CAPTION_TIME+'</th>';
        str += '<th>'+TXT_RES_TABLE_CAPTION_NAME+'</th>';
        str += '<th>'+TXT_RES_TABLE_CAPTION_SCORE+'</th>';
        if(!ds.isArchive){
            str += '<th>'+TXT_RES_TABLE_CAPTION_STATUS+'</th>';
        }
        str += '<th>'+TXT_RES_TABLE_CAPTION_COMMENTS+'</th>';
        if(!ds.isArchive && liveBetsEnabled){
            str += '<th>'+TXT_RES_TABLE_CAPTION_1+'</th>';
            str += '<th>'+TXT_RES_TABLE_CAPTION_X+'</th>';
            str += '<th>'+TXT_RES_TABLE_CAPTION_2+'</th>';
            str += '<th>'+TXT_RES_TABLE_CAPTION_T+'</th>';
            str += '<th>'+TXT_RES_TABLE_CAPTION_TG+'</th>';
            str += '<th>'+TXT_RES_TABLE_CAPTION_TL+'</th>';
        }
        str += '</tr>';
        if(up.sortOrder == UP_SORT_ORDER_BY_SPORTS){
            str += this.getRowsBySportsHTML();  //устаревший метод сортировки
        }else{
            str += this.getSortedRowsByHTML(up.sortOrder);
        }
        str += '</table>';
        return str;
    }
    this.getRowsBySportsHTML = function(){
        var str = '';
        for(var i=0; i < this.sports.length; i++){
            if(this.sports[i] == null) continue;
            str += this.sports[i].getHTML();
        }
        return str;
    }
    this.getSortedRowsByHTML = function(sortOrder){
        var evnts;
        switch(sortOrder){
            case UP_SORT_ORDER_BY_TIME:
                evnts = copyArray(this.events);
                evnts.sort(compareEventTime);
                break;
            case UP_SORT_ORDER_BY_IDS:
            default:
                evnts = this.events;
        }
        var prevSectName = '';
        var str = '';
        for(var i=0; i < evnts.length; i++){
            if(evnts[i] == null) continue;
            var evt = evnts[i];
            var sectId = this.eventSectMap[evt.eventId];
            if(sectId == null) continue; //такого случиться не должно
            var sect = this.sections[sectId];
            if(sect == null) continue;   //такого случиться не должно

            //определение необходимости вывода события
            if (!sect.isShowed) continue; //секцию показывать не надо, продолжаем просмотр событий
            var sport = this.getSport(sect.sportId);
            if(!sport.isShowed) continue; //вид спорта показывать не надо, продолжаем просмотр событий
            //проверяем маску фильтра
            var evtMask = 0;
            switch(evt.status){
                case 0: //событие не началось
                case 1:
                case 8:
                    evtMask = SHOW_FILTER_NOT_STARTED_MASK;
                    break;
                case 2: //событие идёт
                case 7:
                    evtMask = SHOW_FILTER_CURRENT_MASK;
                    break;
                case 3: //событие закончилось
                case 4:
                case 9:
                    evtMask =  SHOW_FILTER_FINISHED_MASK;
                    break;
                case 5: //неизвестно
                    evtMask =  SHOW_FILTER_NOT_STARTED_MASK | SHOW_FILTER_CURRENT_MASK;
                    break;
                default:
                    evtMask =  SHOW_FILTER_NOT_STARTED_MASK | SHOW_FILTER_CURRENT_MASK | SHOW_FILTER_FINISHED_MASK;
            }
            if(!this.isArchive && !(evtMask & up.showFilterMask)) continue;

            //вывод
            if((prevSectName == '')||(prevSectName != sect.name)){
                //выводим название секции
                prevSectName = sect.name;
                str += sect.getCaptionHTML();
            }
            str += evt.getHTML();
        }
        return str;
    }
    this.updatePage = function(lastUpdateServ, lastChangeTime){
        up.updatePage();
        this.updateTable();
        this.lastUpdate = getUTCTime();
        this.lastUpdateByServer = lastUpdateServ;
        this.lastChangeTime = lastChangeTime;
    }
    this.updateTable = function() {
        var resultDiv = document.getElementById(RESULT_DIV_ID);
        if(resultDiv == null) return;
        resultDiv.innerHTML = ds.getHTML();
    }

}
function loadUpdates(){
    var updForm = document.getElementById(UPDATE_FORM_NAME);
    updForm.submit();
}


function Sport(sportId, name){
    this.sportId  = sportId;
    this.name     = name;
    this.sections = new Array();
    this.isShowed = getBooleanCookie('showSport_'+sportId, true);
    this.getHTML = function(){
        if (!this.isShowed) return '';
        var str = '';
        for(var i=0; i < ds.sections.length; i++){
            if(ds.sections[i] == null) continue;
            if(ds.sections[i].sportId != this.sportId) continue;
            str += ds.sections[i].getHTML();
        }
        str += '';
        return str;
    }
}
function Section(sportId, sectId, name, eventIds){
    this.sportId  = sportId;
    this.sectId   = sectId;
    this.name     = name;
    this.eventIds = eventIds;
    this.isShowed = true;
    this.getCaptionHTML = function(){
        var str = '<tr class="sectCaption"><th colspan="'+((ds.isArchive)?5:12)+'">'+this.name+'</th></tr>';
        return str;
    }
    this.getHTML = function(){
        if (!this.isShowed) return '';
        if (this.eventIds.length <= 0) return;
        var str = this.getCaptionHTML()+'<tr><td>';
        for(var i=0; i < this.eventIds.length; i++){
            if(ds.events[this.eventIds[i]] == null) continue;
            str += ds.events[this.eventIds[i]].getHTML();
        }
        str += '</td></tr>';
        return str;
    }
}
function FBEvent(eventId, updateTime, eventTime, name, score, status, comment1, comment2, comment3, goalOrder){
    this.eventId   = eventId;
    this.eventTime = eventTime;
    this.status    = status;
    this.getHTML = function(){
        var comments = ''; var delim = '';
        if(comment1 != ''){comments += delim+comment1; delim = '<br>';}
        if(comment2 != ''){comments += delim+comment2; delim = '<br>';}
        if(comment3 != ''){comments += delim+comment3; delim = '<br>';}
        var liveType = isLiveScheduled();
        if(!ds.isArchive && liveType){
            if(liveType==2){
              comments += delim+TXT_EVENT_IS_LIVE_HT;
            }else{
              comments += delim+TXT_EVENT_IS_LIVE;
            }
            delim = '<br>';
        }
        if(goalOrder != ''){comments += delim+TXT_GOAL_ORDER_PREFIX+goalOrder; delim = '<br>';}
        var str = '';
        if(!ds.isArchive && (line != null)){
          var evtId = line.eventNum2id(eventId);
          var rowIdDef = (evtId==null)?'':' id="'+line.ID_PREFIX_EVENT_STD+evtId+'"';
          var eClass = line.getEventClass(evtId);
          var eClassDef = (eClass==null)?'':' class="'+eClass+'"';
          str = '<tr'+rowIdDef+eClassDef+'>';
        }else{
          str = '<tr>';
        }
        str += '<td align="right" class="resultTd">'+eventId+'</td>';
        str += '<td align="center" class="resultTd">'+(ds.isArchive?timeUTC2DateTimeString(Number(eventTime*1000)):timeUTC2SmartDateTimeString(Number(eventTime*1000)))+'</td>';
        str += '<td class="resultTd">'+((name=='')?'&nbsp;':name)+'</td>';
        if(!ds.isArchive){
            str += '<td align="center" class="resultTd">'+getScoreTag()+'</td>';
            str += '<td align="center" class="resultTd">'+getStatusTag()+'</td>';
        }else{
            switch(status){
                case 4:
                    str += '<td align="center" class="resultTd">'+TXT_EVENT_STATUS_CANCEL+'</td>';
                    break;
                case 9:
                    str += '<td align="center" class="resultTd">'+getScoreTag()+' ('+TXT_EVENT_STATUS_ABANDONED+')'+'</td>';
                    break;
                default:
                    str += '<td align="center" class="resultTd">'+getScoreTag()+'</td>';
            }
        }
        str += '<td class="resultTd">'+((comments=='')?'&nbsp;':comments)+'</td>';
        if(!ds.isArchive && liveBetsEnabled){
            if(typeof(line) != 'undefined'){
                str += line.getFactorHTML(eventId, 'p1');
                str += line.getFactorHTML(eventId, 'pX');
                str += line.getFactorHTML(eventId, 'p2');
                str += line.getFactorHTML(eventId, 't');
                str += line.getFactorHTML(eventId, 'tG');
                str += line.getFactorHTML(eventId, 'tL');
            }else{
                str +='<td>&nbsp</td>';
                str +='<td>&nbsp</td>';
                str +='<td>&nbsp</td>';
                str +='<td>&nbsp</td>';
                str +='<td>&nbsp</td>';
                str +='<td>&nbsp</td>';
            }
        }
        str += '</tr>';
        return str;
    }
    function getScoreTag(){
        if(score == ''){
            return '&nbsp;';
        }
        if(status != 3){
            return  score;
        }else{
            var matches = score.match('^([^(]*)(.*)$');
            var res = '<b>'+matches[1]+'</b>'+matches[2];
            return res;
        }
    }
    function getStatusTag(){
        switch(status){
            case 0:
            case 1:
                return '&nbsp;';
            case 2:
                return TXT_EVENT_STATUS_STARTED;
            case 3:
                return TXT_EVENT_STATUS_FINISH;
            case 4:
                return TXT_EVENT_STATUS_CANCEL;
            case 5:
                return TXT_EVENT_STATUS_UNKNOWN;
            case 7:
                return TXT_EVENT_STATUS_STARTED;
            case 8:
                return '&nbsp;';
            case 9:
                return TXT_EVENT_STATUS_ABANDONED;
            default:
                return '&nbsp;';
        }
    }
    function isLiveScheduled(){
        if(typeof(anonsTable) == 'undefined') return false;
        var a = anonsTable.findAnons(eventId);
        if((a == null)||(a.state <=0)||a.isExpired()) return false;
        return a.state;
    }
}


var SPORTS_SELECT_DIV_ID = 'sportsSelectDiv';
var SECTS_SELECT_DIV_ID  = 'sectSelectDiv';
var SORT_ORDER_DIV_ID    = 'sortOrderDiv';
var SHOW_FILTER_DIV_ID   = 'showFilterDiv';

var UP_SORT_ORDER_BY_SPORTS = -1;
var UP_SORT_ORDER_BY_IDS    = 0;
var UP_SORT_ORDER_BY_TIME   = 1;

var SHOW_FILTER_NOT_STARTED_MASK = 1;  //двоичный 001
var SHOW_FILTER_CURRENT_MASK     = 2;  //двоичный 010
var SHOW_FILTER_FINISHED_MASK    = 4;  //двоичный 100

var up = new UserPref();
function UserPref(){
    this.sortOrder  = (getCookie('sortOrder') == null)?UP_SORT_ORDER_BY_IDS:Number(getCookie('sortOrder'));
    this.showFilterMask = (getCookie('showFilter')== null)?(SHOW_FILTER_NOT_STARTED_MASK | SHOW_FILTER_CURRENT_MASK | SHOW_FILTER_FINISHED_MASK):Number(getCookie('showFilter'));

    this.drawUpComponents = function(){
        this.drawSortOrderHTML();
        this.drawShowFilterHTML();
    }
    this.updatePage = function(){
        this.updateSprotsSelect();
        this.updateSectsSelect();
    }
    this.updateSprotsSelect = function(){
        var sportsSelectDiv = document.getElementById(SPORTS_SELECT_DIV_ID);
        sportsSelectDiv.innerHTML = up.getSportsSelectHTML();
    }
    this.updateSectsSelect = function(){
        var sectsSelectDiv = document.getElementById(SECTS_SELECT_DIV_ID);
        sectsSelectDiv.innerHTML = up.getSectsSelectHTML();
    }
    //порядок сотрировки
    this.drawSortOrderHTML = function(){
        var str = '<table border="0">';
        str += '<tr><td colspan="2">'+TXT_SORT_BY+'</td></tr><tr>';
        str += '<td><input name="upSortOrderInp" type="radio"'+((this.sortOrder == UP_SORT_ORDER_BY_IDS)   ?' checked':'')+' value="'+UP_SORT_ORDER_BY_IDS+'" onclick="up.setSortOrder('+UP_SORT_ORDER_BY_IDS+')">'+TXT_SORT_BY_IDS+'</td>';
        str += '<td><input name="upSortOrderInp" type="radio"'+((this.sortOrder == UP_SORT_ORDER_BY_TIME)?' checked':'')+' value="'+UP_SORT_ORDER_BY_TIME+'" onclick="up.setSortOrder('+UP_SORT_ORDER_BY_TIME+')">'+TXT_SORT_BY_TIME+'</td>';
        str += '</tr></table>';
        var sortOrderDiv = document.getElementById(SORT_ORDER_DIV_ID);
        sortOrderDiv.innerHTML = str;
    }
    this.setSortOrder = function(order){
        this.sortOrder = order;
        var expire = new Date(getUTCTime()+COOKIE_LIFE_TIME);
        setCookie('sortOrder', this.sortOrder, expire);
        ds.updateTable();
    }
    //фильтр вывода событий
    this.drawShowFilterHTML = function(){
        //alert('show:'+ this.showFilterMask + '&' +  SHOW_FILTER_CURRENT_MASK + ' = ' + (this.showFilterMask & SHOW_FILTER_CURRENT_MASK));
        var str = '<table border="0">';
        str += '<tr><td colspan="3">'+TXT_SHOW_FILTER+'</td></tr><tr>';
        str += '<td><input name="upShowFilter_ns" type="checkbox"'+((this.showFilterMask & SHOW_FILTER_NOT_STARTED_MASK)?' checked':'')+' value="'+SHOW_FILTER_NOT_STARTED_MASK+'" onclick="up.setShowFilter(this.checked, '+SHOW_FILTER_NOT_STARTED_MASK+')">'+TXT_SHOW_FILTER_NOT_STARTED+'</td>';
        str += '<td><input name="upShowFilter_c" type="checkbox"'+((this.showFilterMask & SHOW_FILTER_CURRENT_MASK)?' checked':'')+' value="'+SHOW_FILTER_CURRENT_MASK+'" onclick="up.setShowFilter(this.checked, '+SHOW_FILTER_CURRENT_MASK+')">'+TXT_SHOW_FILTER_CURRENT+'</td>';
        str += '<td><input name="upShowFilter_f" type="checkbox"'+((this.showFilterMask & SHOW_FILTER_FINISHED_MASK)?' checked':'')+' value="'+SHOW_FILTER_FINISHED_MASK+'" onclick="up.setShowFilter(this.checked, '+SHOW_FILTER_FINISHED_MASK+')">'+TXT_SHOW_FILTER_FINISHED+'</td>';
        str += '</tr></table>';
        var showFilterDiv = document.getElementById(SHOW_FILTER_DIV_ID);
        showFilterDiv.innerHTML = str;
    }
    this.setShowFilter = function(state, mask){
        if(state){
            this.showFilterMask = this.showFilterMask | mask; //добавдям флаг
        }else{
            this.showFilterMask = this.showFilterMask ^ mask; //исключаем флаг
        }
        var expire = new Date(getUTCTime()+COOKIE_LIFE_TIME);
        setCookie('showFilter', this.showFilterMask, expire);
        //alert(this.showFilterMask);
        ds.updateTable();
    }
    //другое
    this.getSportsSelectHTML = function(){
        var str = TXT_SPORTS_SELECT_NAME+'<br>'
        str += '<select name="showSports" size="6" multiple onchange="UserPrefSportsSelectChanged(this)">';
        for(var i=0; i < ds.sports.length; i++){
            if(ds.sports[i] == null) continue;
            var haveSections = false;
            for(var j=0; j < ds.sections.length; j++){
                if(ds.sections[j] == null) continue;
                if(ds.sections[j].sportId == i){
                    if (ds.sections[j].eventIds.length <= 0) continue;
                    haveSections = true;
                    break;
                }
            }
            if(haveSections){
                str += '<option value="'+i+'"'+((ds.sports[i].isShowed)?' selected':'')+'>'+ds.sports[i].name+'</option>'
            }
        }
        str += '</select>';
        return str;
    }
    this.getSectsSelectHTML = function(){
        var str = '<span style="float: right; margin-right:2px;"><a href="#" onclick="up.selectAll(); return false;" class=HeadM>'+TXT_SELECT_ALL+'</a></span>'+TXT_SECTS_SELECT_NAME+'<br>';
        str += '<select name="showSects" size="6" multiple onchange="UserPrefSectsSelectChanged(this)">';
        for(var i=0; i < ds.sections.length; i++){
            if(ds.sections[i] == null) continue;
            var sect = ds.sections[i];
            var sport = ds.getSport(sect.sportId);
            if(!sport.isShowed) continue;
            str += '<option value="'+i+'"'+((sect.isShowed)?' selected':'')+'>'+sect.name+'</option>'
        }
        str += '</select>';
        return str;
    }
    this.selectAll = function(){
        for(var i=0; i < ds.sports.length; i++){
            if(ds.sports[i] == null) continue;
            ds.sports[i].isShowed = true;
            setCookie('showSport_'+i, 'true');
        }
        for(var i=0; i < ds.sections.length; i++){
            if(ds.sections[i] == null) continue;
            ds.sections[i].isShowed = true;
        }
        up.updateSprotsSelect();
        up.updateSectsSelect();
        ds.updateTable();
    }
}
function UserPrefSportsSelectChanged(s){
    for(var i=0; i<s.options.length; i++){
        ds.sports[Number(s.options[i].value)].isShowed = s.options[i].selected;
        var expire = new Date(getUTCTime()+COOKIE_LIFE_TIME);
        setCookie('showSport_'+s.options[i].value, (s.options[i].selected?'true':'false'), expire);
    }
    up.updateSectsSelect();
    ds.updateTable();
}
function UserPrefSectsSelectChanged(s){
    for(var i=0; i<s.options.length; i++){
        ds.sections[Number(s.options[i].value)].isShowed = s.options[i].selected;
    }
    ds.updateTable();
}




function getUTCTime(){
    var d = new Date();
    return d.getTime();
}
function timeUTC2String(time){
    var d = new Date(time);
    return d.toLocaleString();
}
function timeUTC2TimeString(time){
    var d = new Date(time);
    minutes = d.getMinutes();
    if (Number(minutes) < 10){
        minutes = '0'+minutes;
    }
    hours = d.getHours();
    if (Number(hours) < 10){
        hours = '0'+hours;
    }
    return hours+':'+minutes;
}
function timeUTC2DateTimeString(time){
    var d = new Date(time);
    minutes = d.getMinutes();
    if (Number(minutes) < 10){
        minutes = '0'+minutes;
    }
    hours = d.getHours();
    if (Number(hours) < 10){
        hours = '0'+hours;
    }
    month = d.getMonth() + 1;
    day   = d.getDate();
    return day+'.'+month+' '+hours+':'+minutes;
}
function timeUTC2SmartDateTimeString(time){
    var d = new Date(time);
    minutes = d.getMinutes();
    if (Number(minutes) < 10){
        minutes = '0'+minutes;
    }
    hours = d.getHours();
    if (Number(hours) < 10){
        hours = '0'+hours;
    }
    month = d.getMonth() + 1;
    day   = d.getDate();

    var today = new Date();

    if(( (today.getMonth() == d.getMonth()) && (today.getDate() == d.getDate()) )||
        ( (today.getMonth() == d.getMonth()) && ((today.getDate() + 1) == d.getDate()) && (d.getHours() < 7) )
){
        //if( (today.getMonth() == d.getMonth()) && (today.getDate() == d.getDate()) ){
        return hours+':'+minutes;
    }else{
        return day+'.'+month+' '+hours+':'+minutes;
    }
}


// Sets cookie values. Expiration date is optional
function setCookie(name, value, expire) {
    document.cookie = name + "=" + escape(value)
        + ((expire == null) ? "" : ("; expires=" + expire.toGMTString()));
}
function getCookie(Name) {
    var search = Name + "=";
    if (document.cookie.length > 0) {
        // if there are any cookies
        offset = document.cookie.indexOf(search);
        if (offset != -1) { // if cookie exists
            offset += search.length;
            // set index of beginning of value
            end = document.cookie.indexOf(";", offset)
            // set index of end of cookie value
            if (end == -1)  end = document.cookie.length;
            return unescape(document.cookie.substring(offset, end))
        }else {
            return null;
        }
    }
}

function getBooleanCookie(name, def){
    var c = getCookie(name);
    if((c == null)||(c == '')){
        return def;
    }else{
        if((c == 'true') || (Number(c) > 0)){
            return true;
        }else{
            return false;
        }
    }
}
function copyArray(arr){
    //alert('copyArray-source: '+arr);
    res = new Array();
    for(var i = 0; i < arr.length; i++){
        res[i] = arr[i];
    }
    //alert('copyArray-dest: '+res);
    return res;
}
function compareEventTime(evt1, evt2){
    //if(evt1.eventId == 15) alert('15 -cool!');
    var res = ((evt1!=null)?evt1.eventTime:0) - ((evt2!=null)?evt2.eventTime:0);
    if(res == 0){
        res = ((evt1!=null)?evt1.eventId:0) - ((evt2!=null)?evt2.eventId:0);
    }
    return res;
}





//эти функции пришлось сделать, тк. в Opera не виден parent.ds в actions.php
function clearAll(){
    ds.clearAll();
}
function storeSport(sportId, name){
    ds.storeSport(new Sport(sportId, name));
}
function storeSection(sportId, sectId, name, eventIds){
    ds.storeSection(new Section(sportId, sectId, name, eventIds));
}
function storeEvent(eventId, updateTime, eventTime, name, score, status, comment1, comment2, comment3, goalOrder){
    ds.storeEvent(new FBEvent(eventId, updateTime, eventTime, name, score, status, comment1, comment2, comment3, goalOrder));
}
function getDataStore(){
    return ds;
}
