
function Notepad (id) {
  this.id = undefined;
  this.active = false;
  
  this._setID(id);
}

// #################################

Notepad.prototype._setID = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error('Notepad->_setID: Falsche Anzahl von Argumenten!');
  }
  if (typeof str != 'string') {
    focus();
    throw new Error('Notepad->_setID: Argument str ist nicht vom Typ String!');
  }
  this.id = str;
}     

// #################################

Notepad.prototype.setActive = function (bool) {
  if (arguments.length != 1) {
    focus();
    throw new Error('Notepad->setActive: Falsche Anzahl von Argumenten!');
  }
  if (typeof bool != 'boolean') {
    focus();
    throw new Error('Notepad->setActive: Argument bool ist nicht vom Typ Boolean!');
  }
  this.active = bool;
}

// #################################

Notepad.prototype.getData = function () {
  var data = Tools.getCookieValue(this.id);
  return data;
}       

// #################################

Notepad.prototype.addData = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error('Notepad->addData: Falsche Anzahl von Argumenten!');
  }
  if (typeof str != 'string') {
    focus();
    throw new Error('Notepad->addData: Argument str ist nicht vom Typ String!');
  }
  if (this.hasData(str)) {
     return;
  }
  var data = this.getData();
  if (data.toString().length) {
    data += ',';
  }
  data += str;
  this.saveData(data);
  alert('The product was successfully added to your memo-pad.');
  this.updatePreview();
}             

// #################################

Notepad.prototype.updatePreview = function () {
   var elem = document.getElementById('_PREVIEW_' + this.id);
   if (! elem) {
     return;
   }
   elem.innerHTML = this.getPreview();  
   if (this.getDataLength()) {
     elem.style.display = 'block';
   } else {
     elem.style.display = 'none';
   }
}     

// #################################

Notepad.prototype.hasData = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error('Notepad->hasData: Falsche Anzahl von Argumenten!');
  }
  if (typeof str != 'string') {
    focus();
    throw new Error('Notepad->hasData: Argument str ist nicht vom Typ String!');
  }
  var data = this.getData();
  var arr = Notepad.arrayFromString(data);
  for (var i=0; i<arr.length; i++) {
     var _data = arr[i];
     if (_data != str){
       continue;
     }
     return true;
  } 
   return false;
}  

// #################################

Notepad.prototype.deleteData = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error('Notepad->deleteData: Falsche Anzahl von Argumenten!');
  }
  if (typeof str != 'string') {
    focus();
    throw new Error('Notepad->deleteData: Argument str ist nicht vom Typ String!');
  }
  var data = this.getData();
  var orig = Notepad.arrayFromString(data);
  var copy = [];
  for (var i=0; i<orig.length; i++) {
     var _data = orig[i];
     if (_data != str){
       copy.push(_data);
     }
  } 
  data = Notepad.arrayToString(copy);
  this.saveData(data);
  alert('The product was successfully removed from your memo-pad.');
  this.updatePreview();
}

// #################################

Notepad.prototype.generateQuery = function (elem) {
  if (arguments.length != 1) {
    return false;
  } 
  var data = this.getData();
  var arr = Notepad.arrayFromString(data);
  if (! arr.length) {
    return false;
  }
  for (var i=0; i<arr.length; i++) {
    var idArtikel = arr[i];
    if (! idArtikel.toString().length) {
      continue;
    }
    var param = document.createElement('input');
    param.type = 'hidden';
    param.value = idArtikel;   
    param.name = 'idartikel';
    elem.appendChild(param);
  }
   return true;
}

// #################################

Notepad.prototype.getDataLength = function () {
  var data = this.getData();
  var arr = Notepad.arrayFromString(data);
  return arr.length;
}

// #################################

Notepad.prototype.saveData = function (str) {
  if (arguments.length != 1) {
    focus();
    throw new Error('Notepad->saveData: Falsche Anzahl von Argumenten!');
  }
  if (typeof str != 'string') {
    focus();
    throw new Error('Notepad->saveData: Argument str ist nicht vom Typ String!');
  }
  var data = Tools.setCookieValue(str, this.id);
}

// #################################

Notepad.prototype.getPreview = function () {
  var className = 'merkzettel-link';
  if (this.active) {
      className += '-on';
  }
  var html =  '';
  html +=  '<form method="post" id="_FORM_'+ this.id + '" action="/cgi-bin/cms" onsubmit="return Notepad.getInstance(\''+ this.id +'\').generateQuery(this);">';
  html +=  '<input type="hidden" name="_SID" value="'+ Notepad._SID_ +'"/>';
  html +=  '<input type="hidden" name="_bereich" value="artikel" />';
  html +=  '<input type="hidden" name="_aktion" value="suche" />';
  html +=  '<input type="hidden" name="_status" value="" />';           
  html +=  '<input type="hidden" name="_sprache" value="notepaden" />';
  html +=  '<input type="hidden" name="_sortierung" value="titel_asc" />';
  html +=  '<input type="hidden" name="_persistant_variant" value="merkzettel" />';
  html +=  '<input type="hidden" name="__DEBUG__" value="1" />';
  html +=  '<input type="submit" name="submit" value="Memo-Pad" class="'+ className +'"/>';
  html +=  '<p class="notepad-preview">';
  html +=  this.getDataLength() + ' Article(s)';
  html +=  '</p>';
  html += '</form>';
  return html;
}

// #################################

Notepad.prototype.updateButton = function (str) {
  if (arguments.length!=1) {
    focus();
    throw new Error('Notepad.updateButton: Falsche Anzahl von Argumenten!');
  }
  if (typeof str != 'string') {
    focus();
    throw new Error('Notepad->updateButton: Argument str ist nicht vom Typ String!');
  }
  var elem = document.getElementById('_NOTEPAD_BUTTON_');
  var html = '<a href="javascript:void(0);" onclick="Notepad.getInstance(Notepad._COOKIE_NAME_).addData(\''+ str +'\'); Notepad.getInstance(Notepad._COOKIE_NAME_).updateButton(\''+ str +'\');" class="komponenten-link">Add to memo-pad</a><br />';
  if (this.hasData(str)) {
      html = '<a href="javascript:void(0);" onclick="Notepad.getInstance(Notepad._COOKIE_NAME_).deleteData(\''+ str +'\'); Notepad.getInstance(Notepad._COOKIE_NAME_).updateButton(\''+ str +'\');" class="komponenten-link">Remove from memo-pad</a><br />';
  }
  elem.innerHTML = html;
}

// #################################

Notepad._COOKIE_NAME_ = undefined;
Notepad._SID_ = undefined;
Notepad._increment = [];
Notepad._autoIdxPrefix = '_Notepad_';
Notepad._registerInstance = {};
Notepad._registerInstanceLength = [];

// #################################

Notepad.arrayFromString = function(str) {
  if (arguments.length!=1) {
    focus();
    throw new Error('Notepad.arrayFromString: Falsche Anzahl von Argumenten!');
  }
  if (typeof str != 'string') {
    focus();
    throw new Error('Notepad->arrayFromString: Argument str ist nicht vom Typ String!');
  }
  var arr = [];
  if (! str.length) {
    return arr;
  }
  arr = str.split(/,/);
  return arr;
}

// #################################

Notepad.arrayToString = function(arr) {
  if (arguments.length!=1) {
    focus();
    throw new Error('Notepad.arrayToString: Falsche Anzahl von Argumenten!');
  }
  if (typeof arr != 'object') {
    focus();
    throw new Error('Notepad->arrayToString: Argument arr ist nicht vom Typ Array!');
  }
  var str = '';
  for (var i=0; i<arr.length; i++) {
    if (i > 0) {
      str += ','; 
    }
    str += arr[i];          
  }
  return str;
}

// #################################

Notepad.deleteInstance = function(id) {
  if (arguments.length!=1) {
    focus();
    throw new Error('Notepad.deleteInstance: Falsche Anzahl von Argumenten!');
  }
  if (! (Notepad._registerInstance[id])){
    focus();
    throw new Error('Notepad.deleteInstance: Es ist keine Notepad.Instance mit id=' + id + ' registriert!');
  }
  delete Notepad._registerInstance[id];
}

// #################################

Notepad.getInstance = function(id) {
  if (arguments.length!=1) {
    focus();
    throw new Error('Notepad.getInstance: Falsche Anzahl von Argumenten!');
  }
  if (! (Notepad._registerInstance[id])){
    focus();
    throw new Error('Notepad.getInstance: Es ist keine Notepad.Instance mit id=' + id + ' registriert!');
  }
  return Notepad._registerInstance[id];
}

// #################################

Notepad.createInstance = function(id) {
  if (!arguments.length) {
    id = Notepad._autoIdxPrefix + Notepad._increment.length;
    Notepad._increment.push(1);
  }
  if (! (Notepad._registerInstance[id])){
    Notepad._registerInstance[id] = new Notepad(id);
    Notepad._registerInstanceLength.push(id);
  } else {
    focus();
    throw new Error('Notepad.createInstance: ID schon vorhanden!');
  }
  return Notepad.getInstance(id);
}


