/* Scrapbook scripts */

/* GENERIC TOOLS START*/

var utility = {

	addEvent : function (obj, evType, fn, useCapture){
	  if (obj.addEventListener){
		obj.addEventListener(evType, fn, useCapture);
		return true;
	  } else if (obj.attachEvent){
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	  } else {
		return false;
	  }
	},

	getObj : function (name) {
		if (document.getElementById) {
			this.obj = document.getElementById(name);
			this.style = document.getElementById(name).style;
		} else if (document.all) {
			this.obj = document.all[name];
			this.style = document.all[name].style;
		} else if (document.layers) {
			this.obj = document.layers[name];
			this.style = document.layers[name];
		}
	}, // function getObj(name) END

	/* general purpose function to place text insertion point at the end of any textare, given its id */
	focusTextArea : function (sID) {
		if (!document.getElementById) return;
		var ta = document.getElementById(sID);
		if (!ta || !ta.tagName.match(/textarea/i)) return;
		try {
			var tr = ta.createTextRange()
			tr.collapse(false);
			tr.select();
			ta.focus();
		} catch(e) {}

	}, //function focusTextArea(sID) END

	/* RETRIEVE  X AND Y CO-ORDINATES OF OBJECT ON PAGE START */

	findPosX : function (obj) {
		var curleft = 0;
		if (obj.offsetParent) {
			while (obj.offsetParent) {
				curleft += obj.offsetLeft
				obj = obj.offsetParent;
			}
		} else if (obj.x)
			curleft += obj.x;
		return curleft;
	}, // function findPosX(obj) END

	findPosY : function (obj) {
		var curtop = 0;
		if (obj.offsetParent) {
			while (obj.offsetParent) {
				curtop += obj.offsetTop
				obj = obj.offsetParent;
			}
		}
		else if (obj.y)
			curtop += obj.y;
		return curtop;
	}, // function findPosY(obj) END

	getWindowSize : function() {
		var x,y;
		if (self.innerHeight) // all except Explorer
		{
			x = self.innerWidth;
			y = self.innerHeight;
		}
		else if (document.documentElement && document.documentElement.clientHeight)
			// Explorer 6 Strict Mode
		{
			x = document.documentElement.clientWidth;
			y = document.documentElement.clientHeight;
		}
		else if (document.body) // other Explorers
		{
			x = document.body.clientWidth;
			y = document.body.clientHeight;
		}
		return new Array(x,y);
	},

	getScrollPos : function() {
		var x,y;
		if (self.pageYOffset) // all except Explorer
		{
			x = self.pageXOffset;
			y = self.pageYOffset;
		}
		else if (document.documentElement && document.documentElement.scrollTop)
			// Explorer 6 Strict
		{
			x = document.documentElement.scrollLeft;
			y = document.documentElement.scrollTop;
		}
		else if (document.body) // all other Explorers
		{
			x = document.body.scrollLeft;
			y = document.body.scrollTop;
		}
		return new Array(x,y);
	},
	/* RETRIEVE  X AND Y CO-ORDINATES OF OBJECT ON PAGE END */

	/* GETEVENT START */
	getEvent : function(e) {
		if (e) return e;
		if (window.event) return window.event;
		return null;
	},
	/* GETEVENT END */

	/* GETTARGET START */
	getTarget : function(e) {
		if (e.target) {
			if (e.target.nodeType==3) return e.target.parentNode;	// Fix for Safari
			return e.target;
		}
		if (e.srcElement) return e.srcElement;
		return null;
	},
	/* GETTARGET END */

	/* GETCONTAINER START */
	getContainer : function(obj, tag) {
		var container = obj.parentNode;
		var thisTag = container.tagName.toLowerCase();
		while (thisTag != tag && thisTag!="html") {
			container = container.parentNode;
			thisTag = container.tagName.toLowerCase();
		}
		return (thisTag!="html") ? container : null;
	},
	/* GETCONTAINER END */

	/* CANCELACTION START */
	cancelAction : function(e) {
		if (e && e.stopPropagation && e.preventDefault) {
			e.stopPropagation();
			e.preventDefault();
		}
		if (window.event) {
			window.event.cancelBubble = true;
			window.event.returnValue = false;
		}
		return false;
	},
	/* CANCELACTION START */

	toggleAlternateSS : function(ssName, OnOff) {
		var i, a, main;
		for (i = 0; (a = document.getElementsByTagName("link")[i]); i++) {
			if (a.getAttribute("rel").indexOf("style") != -1 &&
				a.getAttribute("title") && a.getAttribute("title") == ssName) {
				a.disabled = !OnOff;
				if (OnOff) {a.setAttribute("rel", "stylesheet");}
				else {a.setAttribute("rel", "alternate stylesheet");}
				break;
			}
		}
	}
};
/* GENERIC TOOLS END */

/* SCRAPBOOK TOOLS START*/

var scrapbook = {

/* SCRAPBOOK INITIALIZATION START */
	init : function() {
		if (!document.getElementById) return;
		if (!document.getElementsByTagName) return;

		scrapbook.initializeUtensils();
		scrapbook.initializeCategoryEvents();
		scrapbook.initializeCompareEvents();
		scrapbook.initializeNoteEvents();
		scrapbook.initializeNotePadEvents();
		scrapbook.initializeCheckItemEvents();

	},

	initializeUtensils : function() {
		var u = document.getElementById("options");
		if (!u) return;
		var colLI = u.getElementsByTagName("li");
		if (!colLI) return;
		for (var i = 0; i < colLI.length; i++) {
			var li = colLI[i];
			if (!li.id) continue;
			var fn = null;
			switch (li.id) {
				case "printChecked":
					fn = scrapbook.printChecked;
					break;

				case "printEntire":
					fn = scrapbook.printEntire;
					break;

				case "removeChecked":
					fn = scrapbook.removeChecked;
					break;

				case "tellFriend":
					fn = tellFriendScrapbook;
					break;
			}
			if (!fn) continue;
			var a = li.getElementsByTagName("a")[0];
			if (!a) continue;
			utility.addEvent(a, "click", fn, false);
		}
	},

	initializeCategoryEvents : function() {
		var appliances = document.getElementById("appliances");
		if (!appliances) return;
		var colLI = appliances.getElementsByTagName("li");
		if (!colLI) return;
		for (var i = 0; i < colLI.length; i++) {
			var li = colLI[i];
			if (!li.className || !li.className.match(/category/)) continue
			var link = li.getElementsByTagName("a")[0];
			if (!link || link.length==0) continue;
			utility.addEvent(link, "click", scrapbook.showCategory, false);
		}
	},

	initializeCompareEvents : function() {
		var appliances = document.getElementById("appliances");
		if (!appliances) return;
		var colLI = appliances.getElementsByTagName("li");
		if (!colLI) return;
		for (var i = 0; i < colLI.length; i++) {
			var li = colLI[i];
			if (!li.className || !li.className.match(/item-compare/)) continue
			var link = li.getElementsByTagName("a")[0];
			if (!link || link.length==0) continue;
			utility.addEvent(link, "click", scrapbook.compareProducts, false);
		}

	},

	emptyNoteMessage : "",

	initializeNoteEvents : function() {

		// locate emptyNoteMessage content
		var p = document.getElementById("emptyNoteMessage");
		if (p && p.innerHTML) scrapbook.emptyNoteMessage = p.innerHTML;

		var div = document.getElementById("scrap-holder");
		if (!div) return;
		var colLI = div.getElementsByTagName("li");
		if (!colLI) return;
		for (var i = 0; i < colLI.length; i++) {
			var li = colLI[i];
			if (!li.className || !li.className.match(/notes/)) continue
			var link = li.getElementsByTagName("a")[0];
			if (!link || link.length==0) continue;
			scrapbook.setNoteClass(li, link);
			utility.addEvent(link, "click", scrapbook.displayNotePad, false);
		}

	},

	initializeNotePadEvents : function() {
		var notepadClose = document.getElementById("notepad-close");
		if (!notepadClose) return false;
		var saveNote = document.getElementById("saveNote");
		if (!saveNote) return false;
		var removeNote = document.getElementById("removeNote");
		if (!removeNote) return false;
		utility.addEvent(notepadClose, "click", scrapbook.hideNotePad, false);
		utility.addEvent(saveNote, "click", scrapbook.saveNote, false);
		utility.addEvent(removeNote, "click", scrapbook.saveNote, false);

	},

	initializeCheckItemEvents : function() {
		// confirm required markup in place
		var scrapDiv = document.getElementById("scrap-holder");
		if (!scrapDiv) return;
		// collect all inputs in container
		var colInputs = scrapDiv.getElementsByTagName("input");
		if (!colInputs) return;
		var j = 0;
		for (var i = 0; i < colInputs.length; i++) {
			var inp = colInputs[i];
			if (inp.type && inp.type.toLowerCase()=="checkbox" && inp.name && inp.name.indexOf("selected")!=-1) {
				utility.addEvent(inp, "click", scrapbook.selectItem, false);
				++j;
			}
		}
	},
/* SCRAPBOOK INITIALIZATION end */

/* UTENSILS EVENTS START */
	printChecked : function(e) {
		var event = utility.getEvent(e);
		if (!event) return false;

		// confirm 1 or more items is checked
		var count = scrapbook.countChecked();
		if (!count) {
			var el = document.getElementById("errCheckedMessage");
			if (!el || el.innerHTML=="")
				alert("Error Message to follow")
			else
				alert(el.innerHTML);
			utility.cancelAction(event);
			return false;
		}

		utility.toggleAlternateSS("print_checked", true);

		/* set up non-standards windows print behaviour for print checked items */
		window.onbeforeprint = function() {scrapbook.beforePrintIE();};
		window.onafterprint = function()  {scrapbook.afterPrintIE();};

		window.print()
		utility.cancelAction(event);
		setTimeout("utility.toggleAlternateSS('print_checked', false)", 10000);

		/* set up non-standards windows print behaviour for print checked items */
		window.onbeforeprint = function() {};
		window.onafterprint = function() {};
	},

	beforePrintIE : function(e) {
		utility.toggleAlternateSS("print_checked", true);
	},

	afterPrintIE : function(e) {
		utility.toggleAlternateSS("print_checked", false);
	},

	printEntire : function(e) {
		var event = utility.getEvent(e);
		if (!event) return false;
		window.print();
		utility.cancelAction(event);
	},

	removeChecked : function(e) {
		var event = utility.getEvent(e);
		if (!event) return false;
		var target = utility.getTarget(event);
		if (!target) return false;

		// confirm 1 or more items is checked
		var count = scrapbook.countChecked();
		if (!count) {
			var tmp = target.parentNode.href;
			target.parentNode.href="javascript:void(0);";
			utility.cancelAction(event);
			setTimeout(function(){target.parentNode.href=tmp;}, 50);
			var el = document.getElementById("errCheckedMessage");
			if (!el || el.innerHTML=="") alert("Dev Note: Expecting a paragraph with id 'errCheckedMessage' to contain error message text.")
			else alert(el.innerHTML);
			return false;
		}

	},

	countChecked : function() {
		var div = document.getElementById("scrap-holder");
		if (!div) return false;
		var collChecks = div.getElementsByTagName("input");
		if (!collChecks || collChecks.length==0) return false;
		var count = 0;
		for (var i = 0; i < collChecks.length; i++) {
			var chk = collChecks[i];
			if (chk.type.toLowerCase()!="checkbox") continue;
			if (chk.name && chk.name.match(/:selected/) && chk.checked) count++;
		}
		return count;
	},
/* UTENSILS EVENTS END */

/* PRODUCTS EVENTS START */
	showCategory : function(e) {
		var event = utility.getEvent(e);
		if (!event) return false;
		var target = utility.getTarget(event);
		if (!target) return false;
		var thisDiv = utility.getContainer(target, "div");
		var thisList = utility.getContainer(target, "ul");
		var colItems = thisList.getElementsByTagName("li");
		// show/hide current item
		for (var i = 0; i < colItems.length; i++) {
			var li = colItems[i];
			if (li.className && !li.className.match(/category/)) {
				if (!li.className.match(/hide/)) li.className += " hide";
				else li.className = li.className.replace(/ hide/,"");
			} else {
				if (!li.className.match(/collapsed/)) li.className += " collapsed";
				else li.className = li.className.replace(/ collapsed/,"");
			}
		}
		// show/hide related items
		var newCategory = false;
		var thisNodeName = thisList.nodeName;
		while (thisList.nextSibling) {
			try {
				var nextUL = thisList.nextSibling;
				while (nextUL && nextUL.nodeName && nextUL.nodeName!=thisNodeName) nextUL = nextUL.nextSibling;
			} catch(e) {break;}
			thisList = nextUL;
			if (!thisList) break;
			colItems = thisList.getElementsByTagName("li");
			for (var i = 0; i < colItems.length; i++) {
				var li = colItems[i];
				if (li.className && li.className.match(/category/)) {
					// we've cycled into another category set
					newCategory = true;
					break;
				}
			}
			if (!newCategory) {
				if (!thisList.className) thisList.className = "crushed";
				if (!thisList.className.match(/crushed/)) thisList.className += " crushed";
				else thisList.className = thisList.className.replace(/ crushed/,"");
			}
		}
		if (target.href) {
			var tmp = target.href;
			target.href="javascript:void(0);";
			utility.cancelAction(event);
			setTimeout(function(){target.href=tmp;}, 50);
		} else {
			utility.cancelAction(event);
		}
		return false;
	},

	minCompItems : 2,
	maxCompItems : 4,

	compareProducts : function(e) {
		var event = utility.getEvent(e);
		if (!event) return false;
		var target = utility.getTarget(event);
		if (!target) return false;
		var thisForm = utility.getContainer(target, "form");
		var thisDiv = utility.getContainer(target, "div");
		var thisList = utility.getContainer(target, "ul");
		var colItems = thisList.getElementsByTagName("li");
		var numSelected = 0;
		var arrSelected = new Array();

		// current item checked status
		for (var i = 0; i < colItems.length; i++) {
			var li = colItems[i];
			if (li.className && li.className.match(/checkbox/)) {
				var collChk = li.getElementsByTagName("input");
				if (collChk && collChk.length) {
					for (var j = 0; j < collChk.length; i++) {
						var oChk = collChk[j];
						if (oChk.type && oChk.type.toLowerCase()=="checkbox") {
							if (oChk.checked) {
								arrSelected[numSelected] = thisList;
								numSelected++;
							}
							break;
						}
					}
				}
				break;
			}
		}
		// collect related items, count checkmarks
		var newCategory = false;
		var thisNodeType = thisList.nodeType;
		while (thisList && thisList.nextSibling) {
			do {thisList = thisList.nextSibling;} while (thisList && thisList.nodeType != thisNodeType)
			if (!thisList) break;
			colItems = thisList.getElementsByTagName("li");
			for (var i = 0; i < colItems.length; i++) {
				var li = colItems[i];
				if (li.className && li.className.match(/category/)) {
					// we've cycled into another category set
					newCategory = true;
					break;
				}
			}
			if (!newCategory) {
				for (var i = 0; i < colItems.length; i++) {
					var li = colItems[i];
					if (li.className && li.className.match(/checkbox/)) {
						var collChk = li.getElementsByTagName("input");
						if (collChk && collChk.length) {
							for (var j = 0; j < collChk.length; i++) {
								var oChk = collChk[j];
								if (oChk.type && oChk.type.toLowerCase()=="checkbox") {
									if (oChk.checked) {
										arrSelected[numSelected] = thisList;
										numSelected++;

									}
									break;
								}
							}
						}
						break;
					}
				}
			}
		}
		if (numSelected < scrapbook.minCompItems || numSelected > scrapbook.maxCompItems) {
			var inp = document.getElementById("inpCompareMessage");
			var tmp = target.href;
			target.href="javascript:void(0);";
			utility.cancelAction(event);
			setTimeout(function(){target.href=tmp;}, 50);
			if (inp && inp.innerHTML!="") alert(inp.innerHTML);
			return false;
		}

		// turn off all other product checkboxes
		colItems = thisDiv.getElementsByTagName("ul");
		for (var i = 0; i < colItems.length; i++) {
			var ul = colItems[i];
			var j = 0;
			var inCategory = false;
			for (j = 0; j < arrSelected.length; j++) {
				if (ul == arrSelected[j]) {
					inCategory = true;
					break;
				}
			}

			if (!inCategory) {
				var colLI = ul.getElementsByTagName("li");
				for (j = 0; j < colLI.length; j++) {
					var li = colLI[j];
					if (li.className && li.className.match(/checkbox/)) {
						var collChk = li.getElementsByTagName("input");
						if (collChk && collChk.length) {
							for (var k = 0; k < collChk.length; k++) {
								var oChk = collChk[k];
								if (oChk.type && oChk.type.toLowerCase()=="checkbox") {
									if (oChk.checked) {
										oChk.checked = false;
										break;
									}
								}
							}
						}
						break;
					}
				}
			}
		}
	},
/* PRODUCTS EVENTS END */

/* ITEM EVENTS START */
	selectItem : function(e) {
		var event = utility.getEvent(e);
		if (!event) return false;
		var target = utility.getTarget(event);
		if (!target) return false;
		var ul = utility.getContainer(target, "ul");
		if (!ul) return false;
		if (target.checked) {
			ul.className += " selected";
		} else {
			ul.className = ul.className.replace(/ selected/,"");
		}
	},
/* ITEM EVENTS END */

/* NOTES EVENTS START */

	populateNotePad : function(notePad, srcObj) {
		var ta = document.getElementById("notetext");
		if (!ta) return false;
		var item = utility.getContainer(srcObj, "li");
		var div = utility.getContainer(srcObj, "div");
		div = utility.getContainer(div, "div");
		ta.setAttribute("key", item.getAttribute("id"));
		ta.setAttribute("kind", div.getAttribute("id"));
		var span = srcObj.getElementsByTagName("span");
		if (!span || span.length==0) return;
		ta.value = span[0].innerHTML;
	},

	displayNotePad : function(e) {
		var event = utility.getEvent(e);
		if (!event) return false;
		var target = utility.getTarget(event);
		if (!target) return false;
		var notePad = document.getElementById("notepad");
		if (!notePad) return false;
		scrapbook.populateNotePad(notePad, target);

		// determine which heading to display
		var ta = document.getElementById("notetext");
		if (!ta) return false;
		var collP = notePad.getElementsByTagName("p");
		if (!collP || collP.length==0) return;
		if (ta.value.length==0) var targetClass = "notepad-empty";
		else var targetClass = "notepad-entered";
		for (var i = 0; i < collP.length; i++) {
			var p = collP[i];
			if (p.className) {
				if (p.className.indexOf(targetClass) != -1) {
					p.className = targetClass;
				} else {
					p.className += " hide";
				}
			}
		}

		// position notePad
		var left = utility.findPosX(target) + target.offsetWidth + 6;
		var top = utility.findPosY(target) - 4;
		notePad.style.left = ""+left+"px";
		notePad.style.top = ""+top+"px";
		notePad.className = notePad.className.replace(/hide/,"");

		// scroll page to display notePad extents

		// note extents
		var noteRight = left + notePad.offsetWidth;
		var noteBottom = top + notePad.offsetHeight

		// screen extents
		var pos = utility.getScrollPos();
		var screenTop = pos[1];
		var size = utility.getWindowSize();
		var vpRight = size[0]-24;
		var screenHeight = size[1];
		var vpBottom = screenTop + screenHeight;

		// calculate scroll amount(s)
		if (noteRight > vpRight) {
			window.scrollBy(noteRight-vpRight, 0);
		}
		if (noteBottom > vpBottom) {
			window.scrollBy(0, noteBottom-vpBottom);
		}

		utility.cancelAction(event);
		return false;
	},

	notepadOn : function(e) {
		var event = utility.getEvent(e);
		if (!event) return false;
		var target = utility.getTarget(event);
		if (!target) return false;
		var notepad = document.getElementById("notepad");
		if (target != notepad && utility.getContainer(target, "div") != notepad) {
			utility.cancelAction(event);
			return false;
		}

	},

	setNoteClass : function(li, link) {
		if (!li || !link || link.length==0) return;
		var span = link.getElementsByTagName("span");
		if (!span || span.length==0) return;
		if (span[0].innerHTML.length==0) {
			link.className = "";
			if (link.title != scrapbook.emptyNoteMessage) link.title = scrapbook.emptyNoteMessage;
		}
		else link.className = "note_exists";
	},

	setNoteContent : function(noteID, noteText) {
		var li = document.getElementById(noteID);
		if (!li) return;
		var link = li.getElementsByTagName("a")[0];
		if (!link || link.length==0) return;
		var span = link.getElementsByTagName("span");
		if (!span || span.length==0) return;
		// todo: move notetext manipulation into truncatedText function
		if (noteText.length==0) {
			link.title = scrapbook.emptyNoteMessage;
			link.className = "";
		} else if (noteText.length > 110) {
			var idx = noteText.substr(0,110).lastIndexOf(" ");
			var truncatedText = noteText.substr(0,idx) + "...";
			link.title = truncatedText;
			link.className = "note_exists";
		} else {
			link.title = noteText;
			link.className = "note_exists";
		}
		span[0].innerHTML=noteText;
	},

/* NOTES EVENTS END */

/* NOTEPAD EVENTS START */
	hideNotePad : function(e) {
		var event = utility.getEvent(e);
		if (!event) return false;
		var target = utility.getTarget(event);
		if (!target) return false;
		var notePad = document.getElementById("notepad");
		if (!notePad) return false;
		// do we do sanity check, i.e. you made changes but didn't save....
		notePad.className = "hide";
		utility.cancelAction(event);
	},

	saveNote : function(e) {
		var event = utility.getEvent(e);
		if (!event) return false;
		var target = utility.getTarget(event);
		if (!target) return false;
		utility.cancelAction(event);
		var ta = document.getElementById("notetext");
		if (!ta) return false;
		if (target.getAttribute("id") == "removeNote") ta.value = "";
		var fn = null;
		switch (ta.getAttribute("kind")) {
			case "appliances":
				fn = Note.SetProductNote;
				break;
			case "kitchens":
				fn = Note.SetKitchenNote;
				break;
			case "palettes":
				fn = Note.SetPaletteNote;
				break;
			default:
				return;
		}
		if (fn) fn(ta.getAttribute("key"),ta.value);
		scrapbook.hideNotePad(e);
	}

/* NOTEPAD EVENTS END */

}
/* SCRAPBOOK TOOLS END*/

/* stub Note Object for testing */
var Note = {
	id : 0,
	note : "",

	SetProductNote : function(id, note, setNote_callback) {
		Note.id = id;
		Note.note = note
		Notes.SetProductNote( id, note, Note.setNote_callback );
	},

	SetKitchenNote : function(id, note, setNote_callback) {
		Note.id = id;
		Note.note = note
		Notes.SetKitchenNote( id, note, Note.setNote_callback );
	},

	SetPaletteNote : function(id, note, setNote_callback) {
		Note.id = id;
		Note.note = note
		Notes.SetPaletteNote( id, note, Note.setNote_callback);
	},

	setNote_callback : function(response) {
		if (Note.id) {
			scrapbook.setNoteContent(Note.id, Note.note);
		}
	}
}
/* Add onload event handler */
utility.addEvent(window, "load", scrapbook.init, false);

/* API as discussed by appDEV
Scrapbook.GetProduct( string url ); -- returns a ScrapItem object
Scrapbook.GetKitchen( string url ); -- returns a ScrapItem object

Notes.SetProductNote(string identifer, string note);
Notes.SetKitchenNote(string identifier, string note);
Notes.SetPaletteNote(string identifier, string note);

ScrapItem.Included (returns boolean)
ScrapItem.Note (returns string) -- notes may be displayed on product pages in future phases.

*/

// limit text length for TextArea
function limitTextArea(object,max) {
  if (!object) return;
  var text = object.value; if (!text) return;
  if (text.length > max) {
	object.value = text.substr(0,max);
  }
}
