//our global newsletter listener
var gNewsletterListener = new NewsletterImplListener();

//our global newsletter instance
var gNewsletter = new NewsletterImpl(gNewsletterListener);
var gNewsletterSync = new NewsletterImpl();

var gScrollPosn = 0;

////////////////////////////////////////////////
// Article functions
////////////////////////////////////////////////
function highlightArticle(id)
{
	var tElem = document.getElementById(id);
	if (null != tElem) {
   	tElem.style.borderColor='red';
   }
	/*
	document.getElementById(id).style.borderBottomStyle='solid';
	document.getElementById(id).style.borderBottomWidth='1px';
	*/
}
   	   
function resetArticle(id,color,borderStyle)
{  
   //TODO need to improve the highlight and resetArticle article functions so that they are more general
   if(!color)
      color = "#fff";
   var tElem = document.getElementById(id);
   if (null != tElem) {
   	tElem.style.borderColor=color;
	  if(borderStyle!="noBorder")
	  {
	     tElem.style.borderBottomColor='#29a9d4';
	     tElem.style.borderBottomStyle='dotted';
	     tElem.style.borderBottomWidth='2px';
	  }
	}
}

function updateArticle(r){
	showAjaxWaitDialog(false);
   var tClipboard = getCleanClipboard();
   tClipboard.innerHTML = r;
   var tArticle = tClipboard.firstChild;
   var tArticleId = tArticle.id;
   tClipboard.innerHTML = '';
   //alert(tArticle.nodeType + ' : ' + tArticleId + ':' + r);
   var tReplace = document.getElementById(tArticleId).parentNode;
   tReplace.innerHTML = r;
	//We also need to add the drag listener
	registerDraggableArticles();
}

function removeArticle(r){
	if (true) {
		//refresh the whole newsletter
		render();
	} else {
		showAjaxWaitDialog(false);
   	var tRemove = document.getElementById('article_id_' + r);
   	//var tRemove = document.getElementById('article_' + r);
   	tRemove = tRemove.parentNode.parentNode;
   	var tParent = tRemove.parentNode;
   	while (tRemove.hasChildNodes())
   	   tRemove.removeChild(tRemove.lastChild);
   	tParent.removeChild(tRemove);
   }
}

function getCleanClipboard() {
   var tClipboard = document.getElementById('clipboard');
   if (null == tClipboard) {
   	tClipboard = document.createElement('clipboard');
   }
   tClipboard.innerHTML = '';
   return tClipboard;
}

function addArticle(pArticleId){
	showAjaxWaitDialog(true);
	var r = gNewsletterSync.getArticleHtmlById(pArticleId, false);
   var tArticles = document.getElementById('article_list');
   var tClipboard = getCleanClipboard();
   tClipboard.innerHTML = r;
   var tArticle = tClipboard.firstChild;
   var tArticleId = tArticle.id;
   var tArticleName = tArticle.getAttribute('name');
   tClipboard.innerHTML = '';
	var tArticleNodes = document.getElementsByName(tArticleName);
	if (tArticleNodes.length > 0) {
		var tLastChild = tArticleNodes[0].parentNode;
		var tNewChild = tLastChild.cloneNode(true);
		tNewChild.setAttribute('id', tArticleId.replace(tArticleName, tNewChild.getAttribute('name')));
		tNewChild.innerHTML = r;
	   //tClipboard.appendChild(tNewChild);
		//alert(tArticleId + ' : ' + tArticleName + ' : ' + tNewChild.getAttribute('name') + ' : ' + tNewChild.getAttribute('id'));
	   tLastChild.parentNode.appendChild(tNewChild);
	   //tClipboard.innerHTML = '';
		registerDraggableArticles();
		showAjaxWaitDialog(false);
	} else {
		//no article present, get the whole newsletter
		gNewsletter.render();
	}
}

function getArticlePosition(pArticleNr) {
   var tArticleList = document.getElementById('article_list');
   var tArticleListChildren = tArticleList.childNodes;
   var j = 0;
   for (var i = 0; i < tArticleListChildren.length; i++) {
      if (1 == tArticleListChildren[i].nodeType) {
			if (tArticleListChildren[i].getAttribute("name") == "article") {
         	j++;
      	   if (tArticleListChildren[i].getAttribute("id") == pArticleNr) {
   		  	    return j;
	         }
			}
      }
   }
}

function getFieldValue(pField) {
   var tElem = document.getElementById(pField);
   var tResult = null;
   if (tElem == null) {
      var tElems = document.getElementsByName(pField);
      tElem = tElems[0];
      if (tElem != null) {
         if (tElem.nodeName.toLowerCase() == "img") {
            tResult = "pic(" + escape(tElem.getAttribute("alt")) + ';' + escape(tElem.getAttribute("src")) + ")";
         } else if (tElem.nodeName.toLowerCase() == "textarea") {
            tResult = escape(tElem.value);
         } else if (tElem.nodeName.toLowerCase() == "select") {
            tResult = escape(tElem.value);
         } else {
            //tValues[j++] = "UNKNOWN";
         }
      } else {
         //tValues[j++] = "UNKNOWN";
      }
   } else {
      if (tElem.nodeName.toLowerCase() == "img") {
         //alert(tElem.getAttribute("alt") +  ';' + tElem.getAttribute("src"));
         tResult = "pic(" + escape(tElem.getAttribute("alt")) + ';' + escape(tElem.getAttribute("src")) + ")";
      } else {
      	tResult = escape(tElem.value);
      }
   }
   return tResult;
}

function saveArticle() {
	showAjaxWaitDialog(true);
   saveConfigValues();
   var tValues = new Array();
   var tFieldStr = document.getElementById('ARTICLE_FIELDS').value;
   var tFields = tFieldStr.split(",");
   var j = 0;
   for (var i = 0; i < tFields.length; i++) {
      var tField = tFields[i];
      tValues[j++] = tField.replace(/^ARTICLE_/, "");
      //var tElem = document.getElementById('"' + tField + '"');
      var tTextVal = getFieldValue(tField);
      if (tTextVal == null) {
         tTextVal = "UNKNOWN";
      }
      //alert(tField + ' : ' + tTextVal);
      tValues[j++] = tTextVal;
   }
	saveScrollPosn();
   gNewsletter.editArticleTextMultiByIdRefreshAll(document.getElementById('ARTICLE_NR').value, tValues);
}

function saveConfigValues() {
   var tField = document.getElementById('CONFIG_FIELDS');
   if (null == tField) {
   	return;
   }
   var tValues = new Array();
   var tFieldStr = tField.value;
   var tFields = tFieldStr.split(",");
   var j = 0;
   for (var i = 0; i < tFields.length; i++) {
      var tTmp = tFields[i].split(":");
      if (tTmp.length == 2) {
	      var tTextVal = getFieldValue(tTmp[0]);
		   if (null != tTextVal) {
		   	tValues[j++] = tTmp[1];
		   	tValues[j++] = tTextVal;
		   } else {
		   	alert("illegal configuration: element does not exist " + tTmp[0]);
		   }
      	
      }
	}
   if (tValues.length > 0) {
	   gNewsletter.saveConfigFields(tValues);
	}
}

function deleteArticleId(pArticleId) {
	showAjaxWaitDialog(true);
   gNewsletter.deleteArticleId(pArticleId);
}

//callback for canceling edit
function editCurrentArticleCancel() {
   //Do Nothing
}

function renderEditArticle(r) {
	showAjaxWaitDialog(false);
	alert('renderEditArticle remove me: ' + r);
   showEditArticleDialog(gCurrentArticle, "result", saveArticle, editCurrentArticleCancel, r);
}

function getFieldsAsArray() {
   var tValues = new Array();
   var tFieldStr = document.getElementsByName('FIELDS')[0].value;
   var tFields = tFieldStr.split(",");
   var j = 0;
   for (var i = 0; i < tFields.length; i++) {
      var tField = tFields[i];
      tValues[j++] = tField.replace(/^ARTICLE_/, "");
      var tElem = document.getElementById(tField);
      if (tElem == null) {
         var tElems = document.getElementsByName(tField);
         tElem = tElems[0];
         if (tElem != null) {
            tValues[j++] = escape(tElem.value);
         } else {
            //TODO Unknown field
            tValues[j++] = "UNKNOWN";
         }
      } else {
         tValues[j++] = escape(tElem.value);
      }
   }
   return tValues;
}
function registerDraggableArticle(tArticle) {
   var tId = tArticle.getAttribute("id");
   var tParent = tArticle.parentNode.parentNode;
   if (tParent.nodeName.toLowerCase() != 'div') {
      tParent = tParent.parentNode;
   }
   var tArticleName = tParent.getAttribute("id");
   var tArticleType = tParent.getAttribute("name");
   var tNr = tArticle.getAttribute("id");
   dndMgr.registerDraggable( new ArticleDraggable(tId, tArticleName, tArticleType) );
   dndMgr.registerDropZone( new ArticleDropzone(tArticleName, tArticleName, tArticleName, tArticleType, tNr) );
}

function registerDraggableArticles() {
	dndMgr.reset();
   var tArticleList = document.getElementsByName('drag_article');
  	$('newsletterWrapper').getElementsBySelector('[name="drag_article"]').each(function (s) {registerDraggableArticle(s);});
}

////////////////////////////////////////////////
// Newsletter functions
////////////////////////////////////////////////
function deleteNewsletter(){
	showAjaxWaitDialog(true);
   gNewsletter.deleteNewsletter();
}

function renderNewsletter(r){
   document.getElementById('result').innerHTML=r;
	document.getElementById("contentInstance").scrollTop = gScrollPosn;
	document.getElementById("contentInstance").scrollTop = gScrollPosn;
	registerDraggableArticles();
	showAjaxWaitDialog(false);
}

function saveScrollPosn() {
	gScrollPosn = document.getElementById("contentInstance").scrollTop;
}

function render() {
	saveScrollPosn();
	showAjaxWaitDialog(true);
   gNewsletter.render();
}

function updateNewsletterSelect(r) {
	showAjaxWaitDialog(false);
	tNewsletterSelect = document.getElementsByName('selectNewsletterDiv')[0];
	tNewsletterSelect.innerHTML = r;
   changeNewsletter();
}

function updateInstanceSelect(r) {
	showAjaxWaitDialog(false);
	tNewsletterSelect = document.getElementById('selectInstanceDiv');
	tNewsletterSelect.innerHTML = r;
}
function updateCronInstanceSelect(r) {
   showAjaxWaitDialog(false);
   tNewsletterSelect = document.getElementById('selectCronInstanceDiv');
   tNewsletterSelect.innerHTML = r;
}

function setWindowStatus(r) {
	showAjaxWaitDialog(false);
	//window.status = r;
   if (window.statusbar && window.statusbar.visible == true) {
      window.defaultStatus = r;
   } else {
      alert(r);
   }
  	return true;
}

function refreshPage(r) {
	showAjaxWaitDialog(false);
	//TODO what do we do with the result
	//what if it is an error
	if ("OK" == r) {
		window.location.href = window.location.href;
	} else {
		document.getElementById('result').innerHTML=r;
	}
}

function doNothing(r) {
	showAjaxWaitDialog(false);
	//do nothing
}

function subscriberAdded(r) {
	if (r == "1") {
		document.getElementById('result').innerHTML= "Subscriber added successfully!";
	} else {
		document.getElementById('result').innerHTML= "Subscriber could not be added! " + r;
	}
}

function checkSetAttribute(r) {
	//TODO if result is not 0 then we have an error
	if (r != "0") {
		alert("ERROR: " + r);
	}
}

function checkGetAttribute(r) {
	//TODO if result is not 0 then we have an error
	i = r.indexOf(';');
	if (i < 0) {
		alert('No semicolon found: ' + r);
	} else {
		//TODO handle error codes
		tElem = r.substring(0, i);
		//alert('Elem: ' + tElem);
		tValue = r.substring(i + 1, r.length);
		//alert('Value: ' + tValue);
		tHtmlElem = document.getElementsByName(tElem)[0];
		if (null != tHtmlElem) {
			tHtmlElem.value = tValue;
		}
	}
	
}

function checkCallMethod(r) {
	if ("0" == r) {
	   //everything OK
	} else {
		//TODO ml
		alert("ERROR in checkCallMethod: " + r);
	}
}



gNewsletterListener.onInit = renderNewsletter;
gNewsletterListener.onCopyNewsletter = renderNewsletter;
gNewsletterListener.onCreateNewsletter = renderNewsletter;
gNewsletterListener.onEditArticleTextMultiById = updateArticle;
gNewsletterListener.onEditArticleTextMultiByIdRefreshAll = renderNewsletter;
gNewsletterListener.onRender = renderNewsletter;
gNewsletterListener.onDeleteNewsletter = updateCB;
gNewsletterListener.onGetArticleHtml = renderEditArticle;
gNewsletterListener.onGetArticleHtmlById = renderEditArticle;
gNewsletterListener.onDeleteArticleId = removeArticle;
gNewsletterListener.onSaveNewsletter = renderNewsletter;
gNewsletterListener.onAddSubscriber = subscriberAdded;
gNewsletterListener.onEditProject = updateCB;
gNewsletterListener.onNewNewsletterInstance = renderNewsletter;
gNewsletterListener.onGetNewsletterSelect = updateNewsletterSelect;
gNewsletterListener.onGetNewsletter = doNothing;
gNewsletterListener.onGetInstanceSelect = updateInstanceSelect;
gNewsletterListener.onGetNewInstanceSelect = updateInstanceSelect;
gNewsletterListener.onGetCronInstanceSelect = updateCronInstanceSelect;
gNewsletterListener.onSelectedInstance = doNothing;
gNewsletterListener.onSelectedSize = doNothing;
gNewsletterListener.onSaveInstance = setWindowStatus;
gNewsletterListener.onSetAttribute = checkSetAttribute;
gNewsletterListener.onGetAttribute = checkGetAttribute;
gNewsletterListener.onUpdateSubscriber = checkSetAttribute;
gNewsletterListener.onSaveSubscriber = checkSetAttribute;
gNewsletterListener.onCallMethod = checkCallMethod;
gNewsletterListener.onMoveArticleRender = renderNewsletter;
gNewsletterListener.onSaveConfigFields = doNothing;

function selectedPic(pElemName, pId, pUrl) {
	//alert(pElemName + ':' + pId + ':' + pUrl);
	tElem = document.getElementsByName(pElemName)[0];
	if (null != tElem) {
		//alert("Selected pic with url " + pUrl);
		tElem.alt = pId;
		tElem.src = pUrl;
	}
}

function addInitialSubscriber(pID) {
	showAjaxWaitDialog(true);
   var tValues = new Array();
   var tFieldStr = document.getElementById('SUBSCRIBER_FIELDS').value;
   var tFields = tFieldStr.split(",");
   var j = 0;
   for (var i = 0; i < tFields.length; i++) {
      var tField = tFields[i];
      tValues[j++] = tField;
      var tElem = document.getElementById(tField);
      if (tElem == null) {
         var tElems = document.getElementsByName(tField);
         tElem = tElems[0];
         if (tElem != null) {
            if (tElem.nodeName.toLowerCase() == "img") {
               tValues[j++] = "pic(" + escape(tElem.getAttribute("alt")) + ';' + escape(tElem.getAttribute("src")) + ")";
            } else if (tElem.nodeName.toLowerCase() == "textarea") {
               tValues[j++] = escape(tElem.value);
            } else {
               if ("country" == tField) {
				      var tElem = document.getElementById("idCountryNew");
               	if (null != tElem) {
		               tValues[j++] = escape(tElem.value);
               	} else {
		               tValues[j++] = "UNKNOWN";
               	}
               }
            }
         } else {
               //TODO this procedure has become a nightmare, need to refactor and tidyup
               if ("country" == tField) {
				      var tElem = document.getElementById("idCountryNew");
               	if (null != tElem) {
		               tValues[j++] = escape(tElem.value);
               	} else {
		               tValues[j++] = "UNKNOWN";
               	}
               } else {
		            tValues[j++] = "UNKNOWN";
		         }
         }
      } else {
         tValues[j++] = escape(tElem.value);
         //alert(tField + ": " + tElem.value);
      }
   }
   // subscribes a newsletter with confirmation mail
   if(pID) {
      if (gNewsletterSync.addSubscriber(pID,tValues) == 1){
      	alert('Es wurde eine Bestaetigungs E-Mail an '+document.getElementById('email_address').value+' verschickt');
      }
      else{
      	alert('Es konnte keine Bestaetigungs E-Mail verschickt werden!');
      }
   	  showAjaxWaitDialog(false);
   	  
   }
   else{
   // subscribes a newsletter without confirmation mail
 	  gNewsletter.addInitialSubscriber(tValues);
   }
}

function updateCB(r){
	showAjaxWaitDialog(false);
   document.getElementById('result').innerHTML=r;
}

function show( element )
{
   element.style.display = "block"
}

function hide( element )
{
   element.style.display = "none"
}

function replaceLRCF(pValue){
	var tValue = escape(pValue);

	for(i=0; i < tValue.length; i++){
		if(tValue.indexOf("%0D%0A") > -1){
			tValue = tValue.replace("%0D%0A", "\n");
		}
		else if(tValue.indexOf("%0A") > -1){
			tValue = tValue.replace("%0A", "\n");
		}
		else if(tValue.indexOf("%0D") > -1){
			tValue = tValue.replace("%0D", "\n");
		}
	}

	return decodeURIComponent(tValue);
}

function addAction(pDivId, pActionId, pUrl, pText, pInsertBefore) {
   var tDiv = document.getElementById(pDivId);
   if (null != tDiv) {
      tLink = document.createElement('a');
      tLink.id = pActionId;
	   tLink.href = pUrl;
	   tLink.className = "button";
	   tLink.innerHTML = pText;
	   tBeforeElem = null;
	   if (null != pInsertBefore) {
	   	tBeforeElem = document.getElementById(pInsertBefore);
	   }
	   if (null == tBeforeElem) {
		   tDiv.appendChild(tLink);
		} else {
		   tDiv.insertBefore(tLink, tBeforeElem);
		}
   }
}

function removeAction(pActionId) {
   var tAction = document.getElementById(pActionId);
   if (null != tAction) {
   	tAction.parentNode.removeChild(tAction);
   }
}

function enableAction(pActionId, pEnable) {
   var tAction = document.getElementById(pActionId);
   if (null != tAction) {
   	if (pEnable) {
   		tAction.style.visibility = "visible";
   	} else {
   		tAction.style.visibility = "hidden";
   	}
   }
}

function newProject() {
   document.location.href = "setup_first_1.php";
}

function confirmDeleteSubscribers(){
    var agree=confirm("Sollen wirklich alle Kunden geloescht werden?\n\nDies bedeutet,dass Ihr Newsletter nicht mehr versendet werden kann.\nDie Empfaenger muessten neu angelegt/importiert werden.");
 if (agree){
       location.href='subscribers.php?delSubscribers=1';
 }else
       {return;}
}
