/**
 * Библиотека FLINE (FonBet Line)
 */


/**
 * Объект интерфеса пользователя отвечающий за вывод купона
 */
function FLINE_Coupon(contentBlockId, storage, lang){
	this.contentBlockId = contentBlockId;
	this.lang = lang;
    this.changeMode = 'CONFIRM_DOWN';

	//this.factors = new Array();
	this.amountInput = null;

	this.storage = new FLINE_Coupon_Storage(storage, this.factors);
	this.storage.registerUpdateListener(this);
}
FLINE_Coupon.prototype.FACTOR_DELETE = 'coupon_fct_delete';
FLINE_Coupon.prototype.FACTOR_EVENT  = 'coupon_fct_event';
FLINE_Coupon.prototype.FACTOR_TYPE   = 'coupon_fct_type';
FLINE_Coupon.prototype.FACTOR_VALUE  = 'coupon_fct_value';
FLINE_Coupon.prototype.FACTOR_DELETE_BTNTEXT = '<font color="red">X</font>';
FLINE_Coupon.prototype.FACTOR_TOTAL  = 'coupon_fct_total';

FLINE_Coupon.prototype.onRemoveClick = null;
FLINE_Coupon.prototype.onSendClick = null;
FLINE_Coupon.prototype.ID_PREFIX_FACTORROW = 'coupon_fctrow_';
FLINE_Coupon.prototype.ID_PREFIX_NAME      = 'coupon_name_';
FLINE_Coupon.prototype.ID_PREFIX_TYPEINFO  = 'coupon_ti_';
FLINE_Coupon.prototype.ID_PREFIX_VALUE     = 'coupon_val_';
FLINE_Coupon.prototype.ID_PREFIX_FACTOR_TOTAL = 'coupon_fcttotal';
FLINE_Coupon.prototype.BLINK_TIMEOUT = 50;
FLINE_Coupon.prototype.CLASS_ROW_BLINKED = 'blink';
FLINE_Coupon.prototype.CLASS_EVENT_DISSABLED = 'dissabledEvent';

FLINE_Coupon.prototype.AMOUNT_MIN = 0;
FLINE_Coupon.prototype.AMOUNT_MAX = 10000000;

// ====================================== ДОБАВЛЕНИЕ и УДАЛЕНИЕ КОТИРОВОК=======

FLINE_Coupon.prototype.addFactor = function(fctId){
    var fct = this.storage.getRealFactor(fctId);
    if(fct == null) return;
    //if(fct.blocked) return;
    var evt = this.storage.getEvent(fct.eventId);
    if(evt == null) return;
    //if(!evt.isEnabled) return;

    //проверяем взаимные блокировки
    var blockedFctId = this.factorInterloks(fct);
    if(blockedFctId !== false){
	var f = this.storage.getFactor(blockedFctId);
	var e = this.storage.getEvent(f.eventId);
	if(e.id == evt.id){ //заблокировалось само с собой
	    this.removeFactor(f.id);
	}else{
	    this.blink_factor(f.id);
	    return;
	}
    }
    this.storage.addFactor(fct);
    this.paint();
}
FLINE_Coupon.prototype.removeFactor = function(fctId){
  this.storage.removeFactor(fctId);
  this.paint();
}
FLINE_Coupon.prototype.clear = function(){
    this.storage.clear();
    this.amountInput = null;
    this.paint();
}

/**
 * Ищет котировки, с которыми конфликтует новая
 * Возвращает true если такие найдены, или false если ни с кем не конфликтует.
 */
FLINE_Coupon.prototype.factorInterloks = function(newFactor){
  var newEvt = this.storage.getEvent(newFactor.eventId);
  for(var i in this.storage.factors){
    var f = this.storage.factors[i];
    var e = this.storage.getEvent(f.eventId);
    if(e.id == newEvt.id){ //самого себя нельзя добавлять повторно
      return f.id;
    }
    if((newEvt.parent != 0) && (
	(newEvt.parent == e.parent) ||
	(newEvt.parent == e.id)
    )){
      return f.id;
    }
    if( (e.parent != 0) && (newEvt.id == e.parent) ){
      return f.id;
    }
  }
  return false;
}
FLINE_Coupon.prototype.validateAmount = function(amountStr){
    var requestedAmount = this.getAmount();
    if(this.getAmount() != false){
	var hasMoney = userCheckAmountAvaliable(requestedAmount);
	if(hasMoney){
	    return true;
	}else{
	    alert(this.lang.get('coupon_amount_err_notEnough'));
	    return false;
	}
    } 
    if (this.amountInput == null){
	Log.error('FLINE_Coupon.validateAmount', 'Ammount field not found!');
	return false;
    }
    if(this.amountInput.value == ''){
	alert(this.lang.get('coupon_amount_err_none'));
    }else{
	alert(this.lang.get('coupon_amount_err_bad', this.amountInput.value));
    }
    return false;
}    
FLINE_Coupon.prototype.setAmount = function(amount){
    if(this.amountInput != null){
	this.amountInput.value = amount;
    }
}
FLINE_Coupon.prototype.getAmount = function(amountStr){
    if (this.amountInput != null) {
	return  this.parseAmount(this.amountInput.value);
    }else{
	return false;
    }
}
FLINE_Coupon.prototype.parseAmount = function(amountStr){
	if(!amountStr.match(/^[0-9]*(\.[0-9]*)?$/)) return false;
	var val = parseFloat(amountStr);
	if ( (this.AMOUNT_MIN < val) && (val < this.AMOUNT_MAX) ){
		return val;
	}
    return false;
}
FLINE_Coupon.prototype.validateCoupon = function(){
	for(var i in this.storage.factors){
		var f = this.storage.factors[i];
	    var e = this.storage.getEvent(f.eventId);
		if( (f.blocked == true) ||
			(f.value == 0) ||
			(e.isEnabled == false)
		){
			this.blink_factor(f.id);
			return false;
        }
	}
	return this.validateAmount();
}
FLINE_Coupon.prototype.getChangeMode = function(){
    return this.changeMode;
}

// ============================================ РИСОВАНИЕ ======================
FLINE_Coupon.prototype.paint = function(){
	var cb = document.getElementById(this.contentBlockId);
        if(cb == null) return;
	cb.innerHTML = '';
        //if(!userIsBetAllowed()) return;
	if(!this.storage.hasFactors()) return;

	var table = document.createElement('table');
	html_set_class(table, 'coupon');
	var thead = this._paint_thead();
	var tbody = this._paint_tbody();
	table.appendChild(thead);
	table.appendChild(tbody);
	cb.appendChild(table);
}
FLINE_Coupon.prototype._paint_thead = function(){
	var thead = document.createElement('thead');
	var headRow = document.createElement('tr');

	var delTh = document.createElement('th');
  delTh.innerHTML =  this.lang.get(this.FACTOR_DELETE);
  headRow.appendChild(delTh);

	var eventTh = document.createElement('th');
  eventTh.innerHTML =  this.lang.get(this.FACTOR_EVENT);
  headRow.appendChild(eventTh);

	var typeTh = document.createElement('th');
  typeTh.innerHTML =  this.lang.get(this.FACTOR_TYPE);
  headRow.appendChild(typeTh);

	var factValTh = document.createElement('th');
  factValTh.innerHTML =  this.lang.get(this.FACTOR_VALUE);
  headRow.appendChild(factValTh);

  thead.appendChild(headRow);
  return thead;
}
FLINE_Coupon.prototype._paint_tbody = function(){
    var tbody = document.createElement('tbody');
    var fctCount = 0;  // нужно потому что this.factors.length показывает неправильные значения после удаления котировки
    for(var i in  this.storage.factors){
	this._paint_factor(tbody, this.storage.factors[i]);
	fctCount++;
    }
    if(fctCount != 0){
        this._paint_factorTotalRow(tbody);
        this._paint_factorSendRow(tbody);
        this._paint_acceptUpdatesRow(tbody);
        this._paint_changeModeRow(tbody);
    }
    return tbody;
}
FLINE_Coupon.prototype._paint_factorTotalRow = function(tbody){
    var row =  document.createElement('tr');
    
    /*
    var emptyTd = document.createElement('td');
    emptyTd.colSpan = 2;
    row.appendChild(emptyTd);
    */
    
    this._paint_factorAmmountTd(row);
    this._paint_factorTotalTd(row);

    tbody.appendChild(row);
}
FLINE_Coupon.prototype._paint_factorAmmountTd = function(row){
    var td = document.createElement('td');
    td.colSpan = 2;
    
    var textSpan = document.createElement('span');
    textSpan.innerHTML = this.lang.get('coupon_amount_text');
    td.appendChild(textSpan);
    
    if(this.amountInput == null){
	this.amountInput = document.createElement('input');
        this.amountInput.type = 'text';
	html_set_class(this.amountInput, 'couponAmmountInput');
        var coupon = this;
	this.amountInput.onchange = function(text){
	    if ( coupon.parseAmount(this.value) != false ){
		return true;
	    }
	    return false;
	}
    }
    td.appendChild(this.amountInput);
    
    row.appendChild(td);
}
FLINE_Coupon.prototype._paint_factorTotalTd = function(row){
    var td = document.createElement('td');
    td.id = this.ID_PREFIX_FACTOR_TOTAL;
    td.colSpan = 2;

    var ft = this._getFactorTotal();
    td.innerHTML = this.lang.get(this.FACTOR_TOTAL, ft);

    row.appendChild(td);
}
FLINE_Coupon.prototype._refresh_factorTotalTd = function(){
  var ttd = document.getElementById(this.ID_PREFIX_FACTOR_TOTAL);
  if(ttd != null){
    var ft = this._getFactorTotal();
    ttd.innerHTML = this.lang.get(this.FACTOR_TOTAL, ft);
  }
}

FLINE_Coupon.prototype._paint_factorSendRow = function(tbody){
    var row =  document.createElement('tr');

    var sendTd = document.createElement('td');
    sendTd.colSpan = 4;
    sendTd.align = 'center';
    var sendBtn = document.createElement('input');
    sendBtn.type = "button";
    sendBtn.value = lang.get("coupon_bet_sendBtn");
    sendBtn.onclick = this.onSendClick;
    sendTd.appendChild(sendBtn);
    row.appendChild(sendTd);

    tbody.appendChild(row);
}
FLINE_Coupon.prototype._paint_acceptUpdatesRow = function(tbody){
    var row =  document.createElement('tr');
    var auTd = document.createElement('td');
    auTd.colSpan = 4;

    var acceptUpdatesCBox = document.createElement('input');
    acceptUpdatesCBox.type = "checkbox";
    acceptUpdatesCBox.checked = this.storage.acceptUpdates;
    acceptUpdatesCBox.defaultChecked = this.storage.acceptUpdates; //для IE
    var me = this;
    acceptUpdatesCBox.onclick = function(){
    	me.storage.setAcceptUpdates(this.checked);
    }
    auTd.appendChild(acceptUpdatesCBox);
    var acceptUpdatesText = document.createElement('span');
    acceptUpdatesText.innerHTML += this.lang.get("coupon_bet_acceptUpdates");
    auTd.appendChild(acceptUpdatesText);
    
    row.appendChild(auTd);
    tbody.appendChild(row);
}
FLINE_Coupon.prototype._paint_changeModeRow = function(tbody){
    var row =  document.createElement('tr');
    var auTd = document.createElement('td');
    auTd.colSpan = 4;
    var me = this;

    var changeModeText = document.createElement('div');
    changeModeText.innerHTML += this.lang.get("coupon_change_mode_title")+"";
    auTd.appendChild(changeModeText);

    var changeModeSelect = document.createElement('div');
    var modes = ['CONFIRM_ALL', 'CONFIRM_DOWN', 'CONFIRM_NONE'];
    var modesDesc = ['coupon_change_mode_confirm_all', 'coupon_change_mode_confirm_down', 'coupon_change_mode_confirm_none'];
    for(var i in modes){
        var mode = modes[i];
        var modeDesc = this.lang.get(modesDesc[i]);
        changeModeSelect.innerHTML += "<span><input type=\"radio\" name=\"changeMode\" value=\""+mode+"\""+((mode==this.changeMode)?" checked":"")+" onclick=\"coupon.changeMode=this.value;\">"+modeDesc+"</span>";
    }
    auTd.appendChild(changeModeSelect);
    row.appendChild(auTd);
    tbody.appendChild(row);
}

FLINE_Coupon.prototype._paint_factor = function(tbody, fct){
  var evt = this.storage.getEvent(fct.eventId);

  var factorRow =  document.createElement('tr');
  factorRow.id = this.ID_PREFIX_FACTORROW+fct.id;
  if(!evt.isEnabled){
    html_set_class(factorRow, 'dissabledEvent');
  }

  var delTd = document.createElement('td');
  delTd.factor = fct.id;
  delTd.align = 'center';
  html_set_class(delTd, 'btn');
	delTd.onclick = this.onRemoveClick;
  delTd.innerHTML = this.FACTOR_DELETE_BTNTEXT;
  factorRow.appendChild(delTd);

  var eventTd = document.createElement('td');
  eventTd.id = this.ID_PREFIX_NAME+fct.id;
  eventTd.innerHTML = this.lang.get("event_name_with_score", evt.num, evt.name, evt.getScoreTextWithoutComment());
  factorRow.appendChild(eventTd);

  var typeTd = document.createElement('td');
  typeTd.id = this.ID_PREFIX_TYPEINFO+fct.id;
  this._paint_factorTypeInfo(typeTd, fct);
  factorRow.appendChild(typeTd);

  var factValTd = document.createElement('td');
  factValTd.id = this.ID_PREFIX_VALUE+fct.id;
  this._paint_factorValue(factValTd, fct);
  factorRow.appendChild(factValTd);

  tbody.appendChild(factorRow);
}
FLINE_Coupon.prototype._paint_factorValue = function(td, fct){
  td.innerHTML = fct.getValue();
  switch (fct.valueStatus){
  	case fct.STATUS_DISABLED:
  		html_set_class(td, 'factorValueDisabled');
  		break;
  	case fct.STATUS_RAISED:
  		html_set_class(td, 'factorValueRaised');
  		break;
  	case fct.STATUS_LOWERED:
  		html_set_class(td, 'factorValueLowered');
  		break;
  	case fct.STATUS_NOT_CHANGED:
  	default:
  		html_set_class(td, 'factorValueNormal');
  }
}
FLINE_Coupon.prototype._paint_factorTypeInfo = function(td, fct){
  td.innerHTML = fct.getTypeInfo();
  if(fct instanceof FLINE_Factor_PARAM){
	  switch (fct.paramStatus){
  		case fct.STATUS_RAISED:
  			html_set_class(td, 'factorTypeInfoRaised');
	  		break;
  		case fct.STATUS_LOWERED:
  			html_set_class(td, 'factorTypeInfoLowered');
	  		break;
  		case fct.STATUS_NOT_CHANGED:
  		default:
  			html_set_class(td, 'factorTypeInfoNormal');
  	}
  }else{
  	html_set_class(td, 'factorTypeInfoNormal');
  }
}

// ============================================ ОБНОВЛЕНИЯ =====================
FLINE_Coupon.prototype.factorUpdated = function(fct){
    //alert(fct.id);
    if(! this.isInCoupon(fct.id)) return;
    /*if(fct.value == 0){
        this.removeFactor(fct.id);
        return;
    }*/

    // обновление value
    var vtd = document.getElementById(this.ID_PREFIX_VALUE+fct.id);
    if(vtd == null){
	FLINE_Log.error('FLINE_Coupon.factorUpdated', 'vtd not found for factor '+fct.id);
	return;
    }
    this._paint_factorValue(vtd, fct);

    //обновление param
    if(typeof(fct.param) != "undefined"){
		var ptd = document.getElementById(this.ID_PREFIX_TYPEINFO+fct.id);
		if(ptd == null){
			FLINE_Log.error('FLINE_Coupon.factorUpdated', 'ptd not found for factor '+fct.id);
			return;
		}
		this._paint_factorTypeInfo(ptd, fct);
    }

    //обновление суммарного коэф-та
    this._refresh_factorTotalTd();
}
FLINE_Coupon.prototype.eventUpdated = function(evt){
  var fctIds = this.getFactorsForEvent(evt.id);
  for(var i in fctIds){
    var fctId = fctIds[i];
  	var row = document.getElementById(this.ID_PREFIX_FACTORROW+fctId);
  	if(row == null) continue;
	var c = (evt.isEnabled)?null:this.CLASS_EVENT_DISSABLED;
  	html_set_class(row, c);
  }

  //обновление суммарного коэф-та
  this._refresh_factorTotalTd();
}
FLINE_Coupon.prototype.eventScoreUpdated  = function(evt){
    var fctIds = this.getFactorsForEvent(evt.id);
    for(var i in fctIds){
	var fctId = fctIds[i];
	var td = document.getElementById(this.ID_PREFIX_NAME+fctId);
	if(td == null) continue;
	td.innerHTML = this.lang.get("event_name_with_score", evt.num, evt.name, evt.getScoreTextWithoutComment());
    }
}
FLINE_Coupon.prototype.storageStructureChanged  = function(){
    this.paint();
}

// ============================================ РАЗНОЕ =========================
FLINE_Coupon.prototype.blink_factor = function(fctId){
  var tr = document.getElementById(this.ID_PREFIX_FACTORROW+fctId);
  if(tr == null) return;
  //alert(tr);
  var curClass = html_get_class(tr);
  html_set_class(tr, this.CLASS_ROW_BLINKED);
  //alert('fline_set_class_with_check("'+tr.id+'",'+'"'+curClass+'", "'+this.CLASS_ROW_BLINKED+'"'+')');
  window.setTimeout('fline_set_class_with_check("'+tr.id+'",'+'"'+curClass+'", "'+this.CLASS_ROW_BLINKED+'"'+')', this.BLINK_TIMEOUT);
}

FLINE_Coupon.prototype._getFactorTotal = function(){
    var totalFactor = 1;
    for(var i in this.storage.factors){
	var fct = this.storage.factors[i];
	var fctVal = fct.value;
	if(fctVal == 0){
	    fctVal = 1;
	}
	totalFactor *= fctVal;
    }
    return totalFactor.toFixed(2);
}

FLINE_Coupon.prototype.isInCoupon = function(fctId){
    return this.storage.isFactorManaged(fctId);
}
FLINE_Coupon.prototype.getFactorsForEvent = function(evtId){
    var res = new Array();
    for(var i in this.storage.factors){
	var fct = this.storage.factors[i];
	if(fct.eventId == evtId){
	    res.push(fct.id);
	}
  }
  return res;
}


// ======================================
function FLINE_Coupon_Storage(mainStorage){
    this.mainStorage = mainStorage;
    this.mainStorage.registerUpdateListener(this);
    this.mainStorage.registerStorageListener(this);

    this.factors = new Array();

    this._updateListeners = new Array();    
    
    this.acceptUpdates = getBooleanCookie(this.COOKIE_ACCEPT_UPDATES_NAME, false);  //отслеживать изменения котировок?
}
FLINE_Coupon_Storage.prototype.COOKIE_ACCEPT_UPDATES_NAME = 'liveBets.couponAcceptUpdates';
FLINE_Coupon_Storage.prototype.COOKIE_ACCEPT_UPDATES_EXPIRES = new Date(2100,0,1); //1 января 2100-го года

FLINE_Coupon_Storage.prototype.setAcceptUpdates = function(value){
    this.acceptUpdates = value;
    setCookie(this.COOKIE_ACCEPT_UPDATES_NAME,this.acceptUpdates, this.COOKIE_ACCEPT_UPDATES_EXPIRES); 
}
FLINE_Coupon_Storage.prototype.getSport = function(id){
    return this.mainStorage.getSport(id);
}
FLINE_Coupon_Storage.prototype.getEvent = function(id){
    return this.mainStorage.getEvent(id);
}
FLINE_Coupon_Storage.prototype.findFactor = function(eventId, type){
    var fct =  this.mainStorage.findFactor(eventId, type);
    return this.getFactor(fct.id);
}
FLINE_Coupon_Storage.prototype.getRealFactor = function(id){
    return this.mainStorage.getFactor(id);
}    
FLINE_Coupon_Storage.prototype.getFactor = function(id){
    if(this.isFactorManaged(id)){
	return this.factors[id];
    }else{
        return this.mainStorage.getFactor(id);
    }
}
FLINE_Coupon_Storage.prototype.isFactorManaged = function(id){
    for(var i in this.factors){
	var fct = this.factors[i];
	if(fct.id == id) return true;
    }
    return false;
}
FLINE_Coupon_Storage.prototype.addFactor = function(fct){
    var localFct = clone(fct, false);
    localFct.storage = this;
    localFct.paramStatus = localFct.STATUS_NOT_CHANGED //параметр неизменяем в купоне
    this.factors[fct.id] = localFct;
    
    var evt = this.mainStorage.getEvent(fct.eventId);
    evt.setInCoupon(true);
}
FLINE_Coupon_Storage.prototype.removeFactor = function(id){
    if(!(id in this.factors)) return;
    var fct = this.factors[id];
    var evt = this.mainStorage.getEvent(fct.eventId);
    if(evt != null){
	evt.setInCoupon(false);
    }
    delete this.factors[id];
}
FLINE_Coupon_Storage.prototype.clear = function(){
    for(var i in this.factors){
	var fct = this.factors[i];
        var evt = this.mainStorage.getEvent(fct.eventId);
	evt.setInCoupon(false);
    }
    this.factors.length = 0;
}
FLINE_Coupon_Storage.prototype.hasFactors = function(){
    for(var i in this.factors){
	return true;
    }
    return false;
}


FLINE_Coupon_Storage.prototype.registerUpdateListener = function(listener){
    this._updateListeners.push(listener);
}

FLINE_Coupon_Storage.prototype.factorUpdated = function(newFct){
    if(!this.isFactorManaged(newFct.id)) return; //этот нас вообще не касается
    var fct = this.factors[newFct.id];
    
    var isFctValueUpdateAllowed = false;
    if(typeof(fct.param) == "undefined"){
		isFctValueUpdateAllowed = true;
    }else{
		if (fct.param == newFct.param){
			isFctValueUpdateAllowed = true;
		}
    }
    
    if(this.acceptUpdates && isFctValueUpdateAllowed){
	fct.value = newFct.value;
	fct.valueStatus = newFct.valueStatus;
	fct.blocked = newFct.blocked;
    }else{
	//проводим блокировку или возврат в нормальное состояние
	switch(newFct.valueStatus){
	    case newFct.STATUS_DISABLED:
	    case newFct.STATUS_NOT_CHANGED:
		fct.valueStatus = newFct.valueStatus;
		fct.blocked = newFct.blocked;
		break;
	    case newFct.STATUS_RAISED:
	    case newFct.STATUS_LOWERED:
	    default:
		//ничего не делаем
	}
    }
    //оповещаем слушателей
    for(var i in this._updateListeners){
	var l = this._updateListeners[i];
	l.factorUpdated(fct);
    }
}
FLINE_Coupon_Storage.prototype.eventUpdated = function(evt){
    //if(!this.acceptUpdates) return;
    for(var i in this._updateListeners){
	var l = this._updateListeners[i];
	l.eventUpdated(evt);
    }
}
FLINE_Coupon_Storage.prototype.eventScoreUpdated = function(evt){
    //if(!this.acceptUpdates) return;
    for(var i in this._updateListeners){
	var l = this._updateListeners[i];
	l.eventScoreUpdated(evt);
    }
}
FLINE_Coupon_Storage.prototype.eventRemoved = function(evtId){
    var structureChanged = false;
    for(var i in this.factors){
	var fct = this.factors[i];
	if(fct.eventId == evtId){
	    this.removeFactor(fct.id);
	    structureChanged = true;
	}
    }
    if(structureChanged) for(var i in this._updateListeners){
	var l = this._updateListeners[i];
	l.storageStructureChanged();
    }
}
FLINE_Coupon_Storage.prototype.clear = function(){
    for(var i in this.factors){
	var fct = this.factors[i];
        var evt = this.mainStorage.getEvent(fct.eventId);
	if(evt != null) evt.setInCoupon(false);
    }
    this.factors.length = 0;
    for(var i in this._updateListeners){
	var l = this._updateListeners[i];
	l.storageStructureChanged();
    }
}
loadingJSLoaded++;