//***************************************************************************************************
//***************************************************************************************************
//**
//** Route
//** Autor: DF
//** Erstellung: 03.03.2006
//** © rdts AG
//**
//***************************************************************************************************
//***************************************************************************************************


var undefined;

// Konstruktor:
// ------------
//   + Route()
//   + Route.createInstance()
//
// Eigenschaften:
// --------------
//   + _id: str
//   + stationData: obj (Hash)

function Route(idx) {
  this._id = undefined;
  this._urlDetailPrefix = undefined;
  this.stationData = {};
  
  this.id(idx);
  //this._createStationData();
}

/////////////////////////////////////////////////
// Zugriffsmethoden
/////////////////////////////////////////////////

// -------------
// id()
// -------------
Route.prototype.id = function(str) {
  if (arguments.length > 1) {
    focus();
    throw new Error("Route->id: Falsche Anzahl von Argumenten!");
  }
  if (arguments.length) {
    if (typeof str != "string") {
      focus();
      throw new Error("Route->id: Argument ist nicht vom Typ String!");
    }
    this._id = str;
  }
  return this._id;
}


/////////////////////////////////////////////////
// private Instanzmethoden
/////////////////////////////////////////////////

// -------------
// _createStationData()
// -------------
Route.prototype._createStationData = function() {
  var csv = CSVReader.createInstance(this.id());
  csv.setCSVString(RouteData.dataCSV);
  csv.setCSVQuote('"');
  csv.setCSVSeparator(';');
  var rows = csv.getStructureByCSVString();
  for (var i=0; i<rows.length; i++){
    var row = rows[i];
    var idx = row[0];
    this.stationData[idx] = {};
    this.stationData[idx]['id'] = row[0];
    this.stationData[idx]['region'] = row[1];
    this.stationData[idx]['objekt'] = row[2];
    this.stationData[idx]['ort'] = row[3];
    this.stationData[idx]['y'] = row[4];
    this.stationData[idx]['x'] = row[5];
  }
}

/////////////////////////////////////////////////
// öffentliche Instanzmethoden
/////////////////////////////////////////////////

// -------------
// createStationData()
// -------------
Route.prototype.createStationData = function(obj) {
  if (arguments.length != 1) {
    focus();
    throw new Error("Route->createStationData: Falsche Anzahl von Argumenten!");
  }
  if (typeof obj != "object") {
    focus();
    throw new Error("Route->createStationData: Argument ist nicht vom Typ Object!");
  }
  this.stationData = obj;
}

// -------------
// setUrlDetailPrefix()
// -------------
Route.prototype.setUrlDetailPrefix = function(str) {
  if (arguments.length > 1) {
    focus();
    throw new Error("Route->setUrlDetailPrefix: Falsche Anzahl von Argumenten!");
  }
  if (arguments.length) {
    if (typeof str != "string") {
      focus();
      throw new Error("Route->setUrlDetailPrefix: Argument ist nicht vom Typ String!");
    }
    this._urlDetailPrefix = str;
  }
  return this._urlDetailPrefix;
}

// -------------
// drawAllTargets()
// -------------
Route.prototype.drawAllTargets = function(idx, store, listedItems) {
  for (var i in this.stationData){
    if (listedItems && ! (listedItems[i])){
      continue;
    }
    var target = this.stationData[i];
    if (target['y'] && target['x']){
      var elem = undefined;
      elem = document.createElement('a');
      elem.innerHTML = '&#160;';
      elem.id = target['id'];
      if (store && store[target['id']]){
        elem.className = 'route-target-stored';
      } else {
        elem.className = 'route-target';
      }
      var unit = '';
      var trenner = ', ';
      if (! document.all){
        unit = 'px';
      } 
      if (document.all){
        trenner += '\n';
      }
      elem.style.top = parseFloat(parseFloat(target['y']) + 16) + unit;
      elem.style.left = parseFloat(parseFloat(target['x']) - 24) + unit;
      var objStr = target['objekt'];
      if (! document.all){
        objStr.toString().replace(/\n/gi,', ');
      }
      //elem.title = target['ort'] + '' + trenner + '' + objStr;
      elem.title = objStr;
      elem.href = this._urlDetailPrefix + '' + target['id'];
      elem.onclick = function(){station_oeffnen(this.href); return false;};
      if (! idx || ! document.getElementById(idx)){
        document.getElementsByTagName('body')[0].appendChild(elem);
      } else {
        document.getElementById(idx).appendChild(elem);
      }
    }
  }
}

// -------------
// hoverTarget()
// -------------
Route.prototype.hoverTarget = function(idx) {
  if (arguments.length > 1) {
    focus();
    throw new Error("Route->hoverTarget: Falsche Anzahl von Argumenten!");
  }
  var elem = document.getElementById(idx);
  if (!elem){
    return;
  }
  if (elem.className == 'route-target-stored'){
    elem.className = 'route-target-stored-on';
  } else {
    elem.className = 'route-target-on';
  }
}

// -------------
// hoverOutTarget()
// -------------
Route.prototype.hoverOutTarget = function(idx) {
  if (arguments.length > 1) {
    focus();
    throw new Error("Route->hoverOutTarget: Falsche Anzahl von Argumenten!");
  }
  var elem = document.getElementById(idx);
  if (!elem){
    return;
  }
  if (elem.className == 'route-target-stored-on'){
    elem.className = 'route-target-stored';
  } else {
    elem.className = 'route-target';
  }
}

/////////////////////////////////////////////////
// private Klasseneigenschaften
/////////////////////////////////////////////////

Route._defaultID = [];

Route._registerInstance = {};

/////////////////////////////////////////////////
// private Klassenmethoden
/////////////////////////////////////////////////

/////////////////////////////////////////////////
// öffentliche Klasseneigenschaften
/////////////////////////////////////////////////

Route.storedStation = {};

Route.storedMessage = {};

/////////////////////////////////////////////////
// öffentliche Klassenmethoden
/////////////////////////////////////////////////

// -------------
// addTargetToStoredStation()
// -------------
Route.addTargetToStoredStation = function(idx, arrHash, store) {
  if (arguments.length < 2) {
    focus();
    throw new Error("Route.addTargetToStoredStation: Falsche Anzahl von Argumenten!");
  }
  if (! idx) {
    focus();
    throw new Error("Route.addTargetToStoredStation: Es wurde keine ID übergeben!");
  }
  if (! arrHash) {
    focus();
    throw new Error("Route.addTargetToStoredStation: Es wurde kein Hash übergeben!");
  }
  var _store = undefined;
  if (store){
    _store = store;
  } else {
    _store = Route.storedStation;
  }
  if (! _store){
    return;
  }
  _store[idx] = arrHash;
}

// ----------------
// getInstance
// ----------------
Route.getInstance = function (idx) {
  if (arguments.length!=1) {
    throw new Error("Route.getInstance: Falsche Anzahl von Argumenten!");
  }
  if (! (Route._registerInstance[idx])){
    focus();
    throw new Error("Route.getInstance: Es ist keine Route.Instance mit id=" + idx + " registriert!");
  } 
  return Route._registerInstance[idx];
}

// ----------------
// createInstance
// ----------------
Route.createInstance = function (idx) {
  if (!arguments.length) {
    idx = Route._defaultID.length;
    Route._defaultID.push('1');
  }
  idx = idx.toString();
  if (! (Route._registerInstance[idx])){
    Route._registerInstance[idx] = new Route(idx);
  } 
  return Route.getInstance(idx);
}  


