HJ.MyOneList = Class.create();

HJ.MyOneList.prototype = {
   
   
   initialize: function(element, dialogContainer) {
      this.element = element;
      // dialog container is not null if this view is a dialog
      // in case of dialog, dialog container is used to position popups
      this.dialogContainer = dialogContainer;
      var ec = new Af.ElementCollection(this.element);
      this.oneListTable = new Af.HtmlTable("myOneListTable", "taskDone,description,dueDate,cal,helper", ec);
      this.oneListTable.listener = this;	
      this.currentRow = -1;
      this.listNameElement = ec.getFirstElementById("listNameId");
      this.listItemInputBox = ec.getFirstElementById("listItemInputBox");
      this.listItemInputBox.onchange = this.changed.bindAsEventListener(this);
	  this.listItemInputBox.onfocus = this.focusOnTextBox.bindAsEventListener(this);
	  this.listItemInputBox.onblur = this.focusLostTextBox.bindAsEventListener(this);
	  
	  this.defaultValue = this.listItemInputBox.value;
	  
      if (is_ie) {
         this.textChanger = new Af.TextChanger(this.listItemInputBox);
      }
      
      this.deleteListItem = ec.getFirstElementById("deleteListItem");
      this.deleteListItem.onclick = this.deleteItem.bind(this);
	  this.printMyListItem = ec.getFirstElementById("printMyList");
	  if (this.printMyListItem != null) {
		this.printMyListItem.onclick = this.printMyList.bind(this);
	  }

      this.editingCell = null;
      
      // for miniCal
      this.selectedInput = null;
      this.selectedTD = null;     
      this.selectedDateDiv = null;
      
      this.cellChildNode = null;
      this.listOptions = ec.getFirstElementById("listOptions");      
      this.listOptions.onclick = this.showListOptions.bindAsEventListener(this);
      this.listOptionPopup = ec.getFirstElementById("listOptionPopup");
      this.dueDatesOption = ec.getFirstElementById("dueDatesOption");
      this.completedItemsOption = ec.getFirstElementById("completedItemsOption");
      this.addToSchOption = ec.getFirstElementById("addToSchOption");
      this.helpNeededOption = ec.getFirstElementById("helpNeededOption");
      
      this.askForHelp  = ec.getFirstElementById("askForHelp");
      if (this.askForHelp != null) {
		this.askForHelp.onclick = this.sendAskForHelpEmail.bind(this);
      }
      this.sendList = ec.getFirstElementById("sendList");
      if (this.sendList != null) {
        this.sendList.onclick = this.sendSimpleList.bind(this);
      }
		this.learnMore = document.getElementById("learnMore");
		if(this.learnMore!=null){
			this.learnMore.onclick = this.doShowListHelp.bind(this);
		}
		/*if(this.learnMore!=null){
		//	this.learnMore.onmouseout = this.doHideListHelp.bind(this);
		} */
      
      this.myListsTableHeader = ec.getFirstElementById("myListsTableHeader");
			this.renameMyListLink = document.getElementById("renameMyListLink");
			if(this.renameMyListLink!=null){
				this.renameMyListLink.onclick = this.doRenameMyList.bindAsEventListener(this); 
			}
      
      this.simpleView = true;

	  this.isDoneSelected = false;
	  this.isDueSelected = false;
	  this.isHelperSelected = false;

	  this.updateListColumns();
  
  // for miniCal functioning
  	  this.sc = new Array();
  	  this.date = new Date();
  	  this.disabledInput = null;
	  this.miniTableElement = "<div id=\"miniCalContainer\" class=\"miniBox miniCalOneList\"  style=\"z-index:300; position:abolute; \"><div id=\"miniCalTitlePane\" style=\"z-index:100; background-color:#FFFFFF; border:2px solid #489f97; width:185px;\"><h3><a id=\"miniPrevious\" href=\"#\">&lt;</a><span id=\"miniCalHeading\"> December 2007 </span><a id=\"miniNext\" href=\"#\">&gt;</a></h3><table id=\"miniCalTable\" cellspacing=\"0\"></table></div></div>"; 	  
   },
   
   showCal:function() {   	
   	
   	this.removeCal();
   	
   	//  Creates mini Cal Container
    var littleBox = document.createElement('span');
    littleBox.id = "miniCalBox";
    littleBox.className = 'miniCalList';     	
	
	//  creates elements that are needed by the MiniCalendar class.
    littleBox.innerHTML = this.miniTableElement;
    this.selectedDateDiv.appendChild(littleBox);
   	  	  
  	this.miniCalendar = new HJ.MiniCalendar();
  	this.miniCalendar.listener = this;
  	this.miniCalendar.render(this.sc, this.date);
  	
 	// Lock the field so they're not able to edit while the calendar is present
 	this.selectedInput.disabled = 'disabled';
 	this.disabledInput = this.selectedInput;
   },
   
   removeCal:function() {
   	
	this.dateDisabledOff();
	var miniCal = document.getElementById('miniCalBox');
	
	//  If miniCal already exists, remove 		
	if (miniCal!=null) {
		miniCal.parentNode.removeChild(miniCal);		
	}
 	if (this.miniCalendar!=null)
 		{this.miniCalenar = null}  		   	  	
   },

   dateDisabledOff:function() {
	if (this.disabledInput != null) {
		this.disabledInput.disabled = false;
	}
   },

   //  Called from Base Calendar to handle mini calendar event
   dateClicked: function (obj, dt) {
   	  this.dateDisabledOff();
   	  this.showDate(dt);
   },
   
   showDate:function (dt) {

   	var thisRow = this.currentRow;
    
   	var displayDate = (dt.getMonth()+1) + '/' + dt.getDate() + '/' + dt.getFullYear();    	
   	this.selectedInput.value = displayDate;
 
 	var miniBox = document.getElementById('miniCalBox');
 	this.selectedDateDiv.removeChild(miniBox);
 	
    var obj = this.oneListDataTable.getDataList()[thisRow];
   	obj.dueDate = displayDate;
   	  
   	this.saveMyList(obj);	     	
   },

   setVisible: function(f) {
	   if (f) {
	      app.dndMgrScribble.registerDropZone("myOneListTable", this.oneListTable.tableElement, this); 
	      app.dndMgrScribble.registerDropZone("myOneListTable", this.element, this); 
	   }
	},
   
   setMyOneList: function(oneList) {
      this.oneList = oneList;
      if (this.oneList != null) {
		  this.listNameElement.innerHTML = oneList.name;
		  if (this.oneList["item"] == null) {
			 createOneToManyAssoc(oneList, "item", "MyListItem");
		  }
		  this.setDataList(oneList["item"]);
      } else {
         this.setDataList(new Array());
         this.listNameElement.innerHTML = "&nbsp;";
      }
	   this.updateListStatus();
   },
   
   setDataList: function(dlist) {
      this.oneListDataTable = new Af.DataTable(dlist)
      this.oneListTable.setDataList(dlist);
   },
   
   changed: function(evt) {
      var e = evt.target ? evt.target : evt.srcElement;
	  if(this.oneListDataTable == null){
		  showMessageDialog("Please add My List name and then insert items to list.", "Request!", 330, 120);
		  return;
	  }	 
      if(this.listItemInputBox.value != "")
      if (e == this.listItemInputBox) {
		 var insetPos = ((this.oneListDataTable.getDataList().length)); 		
         var obj = this.oneListDataTable.insertObject("description", this.listItemInputBox.value, insetPos, true);
		 
        // this.oneListTable.setDataList(this.oneListDataTable.getDataList());
        // this.currentRow = -1;
         this.saveMyList(obj);
         this.listItemInputBox.value = "";
      } 
      return false;
   },
   
   cellChanged: function(row, col, attrName, v) {
      var obj = this.oneListDataTable.getDataList()[row];
      if (v == null) {
         v = "";
      } else {
         v = "" + v;
      }
      if (obj[attrName] == v) {
         return;
      }
      obj[attrName] = v;
	  this.saveMyList(obj);
   },
   
   saveMyList: function(obj) {
	  var req = new Af.DataRequest(svcURL,this.requestMyListCompletedCommon.bind(this), this.requestFailedCommon.bind(this), null, this.requestTimedoutCommon.bind(this));
      req.addService("WorkspaceService", "saveMyListItem");
      if (obj.UUID != null) {
         req.addParameter("UUID", obj.UUID);
      }
      req.addParameter("selMyListId",this.oneList.UUID);    
      req.addParameter("taskDone", obj.taskDone);

	   var s = "<messages>";
	  if(obj.description != "" && obj.description != undefined) {	
		s += "<description>" + xmlEncode(obj.description) + "</description>";
	  } else {		
		 s += "<description>" + " " + "</description>";
	  }
	  if(obj.dueDate != "" && obj.dueDate != undefined) {		
		s += "<dueDate>" + xmlEncode(obj.dueDate) + "</dueDate>";
	  }
	  else {		 
		    s += "<dueDate>" + " " + "</dueDate>";
	  }
	  if(obj.helper != "" && obj.helper != undefined) {		
		s += "<helper>" + xmlEncode(obj.helper) + "</helper>";
	  } else {		
		  s += "<helper>" + " " + "</helper>";
	  }
	  if(obj.day != "" && obj.day != undefined) {		
		s += "<day>" + xmlEncode(obj.day) + "</day>";
	  } else {		
		  s += "<day>" + " " + "</day>";
	  }
	  if(obj.time != "" && obj.time != undefined) {		
		s += "<time>" + xmlEncode(obj.time) + "</time>";
	  } else {		
		  s += "<time>" + " " + "</time>";
	  }
	  if(obj.location != "" && obj.location != undefined) {		
		s += "<location>" + xmlEncode(obj.location) + "</location>";
	  } else {		
		  s += "<location>" + " " + "</location>";
	  }
	  if(obj.notes != "" && obj.notes != undefined) {		
		s += "<notes>" + xmlEncode(obj.notes) + "</notes>";
	  } else {		
		  s += "<notes>" + " " + "</notes>";
	  }
	  s += "</messages>";
	  req.xmlDoc = s;
      this.saveObj = obj;	 
      ajaxEngine.processRequest(req);  			
	  
   },
   
   requestMyListCompletedCommon: function(response) {
      if (this.saveObj.UUID == null) {
         this.saveObj.UUID = response.responseText;
		 this.oneListTable.setDataList(this.oneListDataTable.getDataList());
         this.currentRow = -1;                 
      }
   },
   
   requestFailedCommon: function(dataRequest, msg) {
      hideDialogWin();
      showMessageDialog("We are currently unable to save this record. Please try again.", "Excuse us!", 400, 150);
   },
   
   requestTimedoutCommon: function(dataRequest) {
      hideDialogWin();
      showMessageDialog("We are currently unable to save this record. Please try again.", "Excuse us!", 400, 150);
   },
  
   cellSelected: function(row, col, reselected) {
	  
	  this.removeCal();
	  
      this.selectedRow = row;
      var e = this.oneListTable.getCell(row, col);      
      
      this.currentRow = row;
      this.currentCol = col;
      if (reselected) {
         if (e == this.editingCell ) {
            return;
         }
         this.editingCell = e;
      } else {
         this.oneListTable.selectRow(row);
      }

	  if (col == 2) {
		
		// Used to track positioning of Mini Calendar	  	
      	var selectedTD = e.getElementsByTagName('input');
      	this.selectedInput = selectedTD[0];
      	this.selectedDateDiv = e;

      	this.showCal();      	
     }      
   },
   
   deleteItem: function() {
   
      if (this.currentRow == -1) {
		  showMessageDialog("Please click on the item you would like to delete <br/> then click Delete.", "Select Item", 350, 100);
         return false;
      }
      var obj = this.oneListDataTable.deleteObjectByIndex(this.currentRow);
      this.oneListTable.setDataList(this.oneListDataTable.getDataList());
      this.deleteMyListItem(obj);
      this.currentRow = -1;
      return false;
   },
   
   deleteMyListItem: function(obj) {
      if (this.currentRow == -1) {
         return;
      }
      var req = new Af.DataRequest(svcURL,this.requestMyListDeletedCompletedCommon.bind(this), 
			this.requestFailedCommon.bind(this), null, this.requestTimedoutCommon.bind(this));
      req.addService("WorkspaceService", "deleteMyListItem");
      req.addParameter("UUID", obj.UUID);
      req.addParameter("selMyListId",this.oneList.UUID)
      ajaxEngine.processRequest(req);
   },
   
   requestMyListDeletedCompletedCommon: function(response) {
      
   },
   
   processDragBegin: function(draggable) {
   },
   
      
   processDragged: function(draggable, e) {
         
   },
      
   processDragComplete: function(source, target, e) {
       var idx = htmlTableRowIndexAt(this.oneListTable.tableElement, e);
       if (idx < 0) {
          idx = this.oneListDataTable.getDataList().length;
       } else {
          //idx++;
       }
       if (idx >= 0) {
         var obj = this.oneListDataTable.insertObject("description", source.text, idx, true);
         this.oneListTable.setDataList(this.oneListDataTable.getDataList());
         this.currentRow = -1;
         this.saveMyList(obj);
       }
   },
   
   showListOptions: function(e) {
   
      if (this.listOptionsDropDown == null) {
         this.listOptionsDropDown = new Af.DropDown(this, this.listOptionPopup, this.element, "List Options");
      }
      var p = RicoUtil.toDocumentPosition(this.listOptions);
      var x = p.x;
      var y = p.y  + this.listOptions.offsetHeight;
      if (this.dialogContainer != null) {
		  p = RicoUtil.toDocumentPosition(this.dialogContainer);
		  x -= p.x;
		  y -= p.y;
      }
      this.listOptionsDropDown.show(x, y);
	  if (is_ie && !is_ie7) {
		  this.setOptionStatus();
	  }	   
      return false;
   },
    
	setOptionStatus: function() {
		
	   if(this.oneList["isDoneSelected"] == "Yes"){		    
		  this.completedItemsOption.checked = true;		
	   }
	   if(this.oneList["isDueSelected"] == "Yes"){
		   this.dueDatesOption.checked = true;
	   }
	   if(this.oneList["isHelperSelected"] == "Yes"){
		   this.helpNeededOption.checked = true;
	   }
	   return;
	},
   
   dropDownClicked: function(dropDown, ev) {
       var t = ev.target ? ev.target : ev.srcElement;
       if (t.checked != null) {
          this.updateListColumns();
		   this.doMemoriesListStatus();
       }
   },
   
   updateListColumns: function() {   
   	
      this.simpleView = true;
   
      var r = this.oneListTable.templateRow;
   
      var cws = this.oneListTable.columnsWidth;
      
      var w = cws[1];
 
      var childNodes = r.getElementsByTagName("TD");
      var headerChildNodes = this.myListsTableHeader.getElementsByTagName("TD");
      if (this.completedItemsOption.checked) {
         childNodes[0].style.display = "";
      } else {
         childNodes[0].style.display = "none";
         w += cws[0];
      }
      
      if (this.dueDatesOption.checked) {
         childNodes[2].style.display = "";
      } else {
         childNodes[2].style.display = "none";
         w += cws[2];
      }
      
      if (this.addToSchOption.checked) {
         childNodes[3].style.display = "";
      } else {
         childNodes[3].style.display = "none";
         w += cws[3];;
      }
      
      if (this.helpNeededOption.checked) {
         childNodes[4].style.display = "";
      } else {
         childNodes[4].style.display = "none";
         w += cws[4];;
      }
      
      childNodes[1].style.width = w + "px";
      var tnodes =  childNodes[1].getElementsByTagName("INPUT");
      if (tnodes.length > 0) {
         tnodes[0].style.width = (w-4) + "px";
      }
      headerChildNodes[1].style.width = w + "px";
      
      if (this.completedItemsOption.checked) {
         headerChildNodes[0].style.display = "";
         this.simpleView = false;
		 this.isDoneSelected = true;
		 if (this.oneList != null)
			 this.oneList["isDoneSelected"] = "Yes";
      } else {
         headerChildNodes[0].style.display = "none";
		 this.isDoneSelected = false;
		 if (this.oneList != null)
			this.oneList["isDoneSelected"] = "No";
      }
      
    
      if (this.dueDatesOption.checked) {
         headerChildNodes[2].style.display = "";
         this.simpleView = false;
		 this.isDueSelected = true;
		 if (this.oneList != null)
			 this.oneList["isDueSelected"] = "Yes";
      } else {
         headerChildNodes[2].style.display = "none";
		 this.isDueSelected = false;
		 if (this.oneList != null)
			this.oneList["isDueSelected"] = "No";
      }
      
      
      if (this.addToSchOption.checked) {
         headerChildNodes[3].style.display = "";
         this.simpleView = false;
      } else {
         headerChildNodes[3].style.display = "none";
      }
      
      if (this.helpNeededOption.checked) {
         headerChildNodes[4].style.display = "";
         this.simpleView = false;
		 this.isHelperSelected = true;
		 if (this.oneList != null)
			 this.oneList["isHelperSelected"] = "Yes";
      } else {
         headerChildNodes[4].style.display = "none";
		 this.isHelperSelected = false;
		 if (this.oneList != null)
			this.oneList["isHelperSelected"] = "No";
      }
      
      
      if (this.oneList != null) {
		 this.setDataList(this.oneList["item"]);					
		// app.myLists.dataTable.addObject(this.oneList);		
      }		  	
		
   },

	updateListStatus: function() {
		 if (this.oneList != null) {			
			if(this.oneList["isDoneSelected"] == null || this.oneList["isDoneSelected"] == "Yes")
				this.completedItemsOption.checked = true;
			else
				this.completedItemsOption.checked = false;

			if(this.oneList["isDueSelected"] == null || this.oneList["isDueSelected"] == "Yes")
				this.dueDatesOption.checked	= true;
			else 
				this.dueDatesOption.checked	= false;
			if(this.oneList["isHelperSelected"] == null || this.oneList["isHelperSelected"] == "Yes")
				this.helpNeededOption.checked = true;
			else
				this.helpNeededOption.checked = false;			

		  this.updateListColumns();
		}		

		return;
	},

	doMemoriesListStatus: function() {		
		if(this.oneList == null || this.oneList == undefined) {
			return;
		}
		var req = new Af.DataRequest(svcURL,this.statusSaveCompleted.bind(this), this.statusSaveFailed.bind(this), null, this.statusSaveTimedout.bind(this));
				req.addService("WorkspaceService", "memoriesListStatus");	

					req.addParameter("myListId", this.oneList.UUID);
					req.addParameter("isDoneClicked",this.isDoneSelected);				
					req.addParameter("isDueClicked",this.isDueSelected);				
					req.addParameter("isHelperClicked",this.isHelperSelected);				 
				
				ajaxEngine.processRequest(req);	
		
	},
	statusSaveCompleted: function(response) {
		/*
		   var xds = new Af.XMLToDataSet(response.responseXML);
		   var e = xds.data;	
		*/
	},
	statusSaveFailed: function() {			
	},
	statusSaveTimedout: function() {
	},


	 printMyList:function(){		
				var req = new Af.DataRequest(svcURL,this.printCompleted.bind(this), this.printFailed.bind(this), null, this.requestTimedout.bind(this));
				req.addService("WorkspaceService", "getPrintHtmlFromXML");
				req.addParameter("templateName", "myLists");
				if(this.simpleView){
						req.addParameter("xlstFile","MyListsSimpleView.xsl");
				}
				else{
						req.addParameter("xlstFile","MyListWithSignUp.xsl");
				}
				if(this.completedItemsOption.checked) 
					req.addParameter("isDoneClicked","Yes");
				if(this.helpNeededOption.checked) 
					req.addParameter("isHelperClicked","Yes");
				if(this.dueDatesOption.checked) 
					req.addParameter("isDueClicked","Yes");
				 
				req.addParameter("myListId", this.oneList.UUID);
				ajaxEngine.processRequest(req);
				return false;
		},


	printCompleted: function(response)	{
		var p = new Af.PrintUtil();
        p.showPrintView(response);
	},

	printFailed: function() {
		showMessageDialog("<br/>Printing is currently unavailable. Please try again.", "Printing Unavailable", 400, 150); 
	},

	requestTimedout: function() {
		showMessageDialog("<br/>Printing is currently unavailable. Please try again.", "Printing Unavailable", 400, 150); 
	},
	
	sendAskForHelpEmail: function() {
	   if(this.oneListDataTable == null || this.oneListDataTable.getDataList().length == 0) {
			showMessageDialog("Please add items to your list before asking for help with them.","Request", 400, 130); 
			return false;
	   }
	  if (this.askForHelpDialog == null) {
         this.askForHelpDialog = new HJ.MyListEmail("Request Sign-Ups Email", this, null);
         this.askForHelpDialog.requestType = "askForHelp";
         this.askForHelpDialog.width = "330px";		
      }
      this.askForHelpDialog.showHTMLTemplate(basePageURL + "MyListsAskForHelpEmail.htm", "content", "myListAskForHelpEmail");
	  this.askForHelpDialog.centerDialog(150, 250);
      this.askForHelpDialog.setObj(this.oneList);		   
	},
	
	sendSimpleList: function() {  
	  if(this.oneListDataTable == null || this.oneListDataTable.getDataList().length == 0) {
			showMessageDialog("Please add items to your list before sending it to others", "Request", 400, 130); 
			return false;
	  }
		
	  if (this.sendDialog == null) {
         this.sendDialog = new HJ.MyListEmail("Send List Email", this, null);
         this.sendDialog.width = "330px";		
      }
      this.sendDialog.showHTMLTemplate(basePageURL + "MyListsSimpleListEmail.htm", "content", "myListSimpleEmail");
	  this.sendDialog.centerDialog(150, 250);
      this.sendDialog.setObj(this.oneList);	   
	},

	focusOnTextBox: function(evt) {
      this.listItemInputBox.value = "";
	  this.listItemInputBox.focus();
   },
   
   focusLostTextBox: function(evt) { 
         this.listItemInputBox.value = this.defaultValue;
         consumeEvent(evt);			              
   },

	 doRenameMyList: function(ev) {
		consumeEvent(ev);
		if(this.oneList.name == null || this.oneList.name =="") {
			showMessageDialog("please select list name to rename.", "Request!", 300, 100);
			return;
		}

		if(this.editDialog == null) {  
			this.editDialog = new HJ.AddMyListDialog("Rename MyList", this, null);
			this.editDialog.left = 200;
			this.editDialog.top = 60;
		}
		this.editDialog.showHTMLTemplate(basePageURL + "AddMyList.html", "content", "newMyList");
		this.editDialog.centerDialog(400, 280);
		this.editDialog.setDataObject(this.oneList, "Type new Name of MyList");
		return false;
	},

	doShowListHelp:function(){
		if(this.showListHelpDialog!=null){
			delete this.showListHelpDialog;
		}
		var handler1 = {
			templateLoaded: function() {
				this.parent.showListHelpTemplateLoaded();
			},
			parent:this
		};
		this.showListHelpDialog = new Af.HtmlDialog("Send List Help", handler1, null);
		this.showListHelpDialog.width = "560px";
		this.showListHelpDialog.showHTMLTemplate(basePageURL + "SendListGuide.htm", "MainArea", "listGuidelineDiv");
		this.showListHelpDialog.centerDialog(350, 350);
		this.showListHelpDialog.setLocation("100", "100");
	},

	showListHelpTemplateLoaded:function(){
		 this.okButton = document.getElementById("OkButton");
		 this.okButton.onclick = this.doHideListHelp.bind(this);
	 },

	doHideListHelp:function(){
		 this.showListHelpDialog.hide();
	}
	
	
}

