/**
 *
 * MboxNVX 
 * Mbox Reduced Implementation
 * @version 2.0.0
 *
 */

var mboxNVXOffer = function () {
	// Stored the offer name and the form location
	var offerTest = "";
	var formName ="";
	
	/**
	 *  addLoadEvent is a function used to append functions
	 *  to the window.onload event.
	 *  @param func The function name to execute once the page has finished loading
	 */
	var addLoadEvent = function(func) {
		var oldonload = window.onload;
		if (typeof window.onload != 'function') {
			window.onload = func;	
		} else {
			window.onload = function() {
				if (oldonload) {
					oldonload();
				}
				func();
			};
		}
	};
	/**
	 * onElementAppear is a class used to create an 
	 * interval timer to find an element in the DOM. 
	 * Once an element is found in the DOM, the 
	 * interval timer will be removed and a function will be executed
	 * @param func The function name to execute once the element has been found
	 * @param original The element ID to search for in the DOM tree
	 * @param replacement Additional content to be used for replacement
	 */
	function onElementAppear(func, original, replacement) {
		var onElementTimer;
		var onElementFunc = func;
		var onElementID = original;
		var onContentNew = replacement;
		function findElems() {
			if(document.getElementById(onElementID)) {
				clearInterval(onElementTimer);
				eval(onElementFunc)(onElementID, replacement);
			}
		}
		this.setFind = function() {
			onElementTimer = setInterval(findElems, 20);
		};
	}	
	// Modifies CSS
	var modifyCSS = function(){
		var cssIndex = 0;
		var getCSSRule = function (ruleName) {
			ruleName = ruleName.toLowerCase();
			if (document.styleSheets) {
				for(var i=0; i<document.styleSheets.length; i++) {
					var styleSheet = document.styleSheets[i];
					var j=0;
					var cssRule = false;
					if(styleSheet.title == "mboxNVXOffer") {
						cssIndex = i;
						do {
							cssRule = (styleSheet.cssRules) ? styleSheet.cssRules[j] : styleSheet.rules[j];	
							if (cssRule) {
								if (cssRule.selectorText.toLowerCase()==ruleName) {
									return cssRule;
								}
							}
							j++;
						}while (cssRule);
					}
				}
			}
			return false;
		};
		var addDefaultStyleSheet = function() {
			var cssNode = document.createElement('style');
			cssNode.type = 'text/css';
			cssNode.rel = 'stylesheet';
			cssNode.media = 'screen';
			cssNode.title = 'mboxNVXOffer';
			document.getElementsByTagName("head")[0].appendChild(cssNode);	
		};
		var addCSSRule = function(ruleName) {
			if (document.styleSheets) {
				if (!getCSSRule(ruleName)) {
					if (document.styleSheets[cssIndex].addRule) {
						document.styleSheets[cssIndex].addRule(ruleName, null,0);
					} else {
						document.styleSheets[cssIndex].insertRule(ruleName+' { }', 0); 
					}                                                
				}                                                   
			}                                                      
			return getCSSRule(ruleName);                           
		};
		return {
			get: function (ruleName) {
				getCSSRule(ruleName);
			},
			add: function (ruleName) {
				addCSSRule(ruleName);
			},
			hide: function (original) {
				var origElemStyle = addCSSRule('#'+original);
				origElemStyle.style.visibility = "hidden";
			},
			show: function (original) {
				var origElemStyle = addCSSRule('#'+original);
				origElemStyle.style.visibility = "visible";
			},
			none: function (original) {
				var origElemStyle = addCSSRule('#'+original);
				origElemStyle.style.display = "none";
			},
			hideDefault: function (original) {
				var origElemStyle = addCSSRule('.'+original);
				origElemStyle.style.display = "none";
			},
			init: function () {
				addDefaultStyleSheet();
			}
		};
	}();
	modifyCSS.init();
	modifyCSS.hideDefault("mboxNVXOffer");	
	// Replace script swaps out content from one div into another div
	function replaceInit(original, replacement) {
		modifyCSS.hide(original);
		var replaceExec = new onElementAppear("replaceExec", original, replacement);
		replaceExec.setFind();
	}
	function replaceExec(original, replacement) {
		document.getElementById(original).innerHTML = document.getElementById(replacement).innerHTML;
		document.getElementById(replacement).innerHTML = "";
		modifyCSS.show(original);
	}	
	// Hide script hides divs. Simpler than adding CSS, keeps offer syntax clean
	function hideInit(original) {
		modifyCSS.none(original);
	}	
	// Remove script destroys the innerHTML of an element
	function removeInit(original) {
		modifyCSS.none(original);
		var removeExec = new onElementAppear("removeExec", original);
		removeExec.setFind();
	}
	function removeExec(original, replacement) {
		document.getElementById(original).innerHTML = "";
	}	
	// Append script appends content to the innerHTML of an element
	function appendInit(original, replacement) {
		modifyCSS.hide(original);
		var appendExec = new onElementAppear("appendExec", original, replacement);
		appendExec.setFind();
	}
	function appendExec(original, replacement) {
		document.getElementById(original).innerHTML += document.getElementById(replacement).innerHTML;
		document.getElementById(replacement).innerHTML = "";
		modifyCSS.show(original);
	}	
	// Prepend script prepends content to the innerHTML of an element
	function prependInit(original, replacement) {
		modifyCSS.hide(original);
		var prependExec = new onElementAppear("prependExec", original, replacement);
		prependExec.setFind();
	}
	function prependExec(original, replacement) {
		document.getElementById(original).innerHTML = document.getElementById(replacement).innerHTML + document.getElementById(original).innerHTML;
		document.getElementById(replacement).innerHTML = "";
		modifyCSS.show(original);
	}	
	// SRC script changes the source of an image or input image
	function srcInit(original, replacement) {
		modifyCSS.hide(original);
		var srcPreload = new Image();
		srcPreload.src = replacement;
		var srcExec = new onElementAppear("srcExec", original, replacement);
		srcExec.setFind();
	}
	function srcCheck(original) {
		if(document.getElementById(original).nodeName.toLowerCase()=="img") {
			return true;
		} else if ((document.getElementById(original).nodeName.toLowerCase()=="input") && (document.getElementById(original).type.toLowerCase()=="image")) {
			return true;
		}
		else {
			return false;
		}
	}
	function srcExec(original, replacement) {
		if(srcCheck(original)) {
			document.getElementById(original).src = replacement;
		}
		modifyCSS.show(original);
	}
	
	// Info displays info about MboxNVX 
	function infoInit (){
		var infoMsg = "Norvax Mbox JavaScript Helper\nVersion 2.0.0 \n(c) 2009-2010 Norvax, Inc.";
		if(typeof console != "undefined") {
			console.log(infoMsg);
		}
		else {
			alert(infoMsg);
		}
	}
	// Adds offer information to a page
	function offerInit() {
		if(document.getElementsByName("custom_tnt").length == 0){
			var custom_tnt = document.createElement("input");
			custom_tnt.type = "hidden";
			custom_tnt.name = "custom_tnt";
			custom_tnt.value = offerTest;
			document.getElementsByName(formName)[0].appendChild(custom_tnt);		
		}
	}	
	// Publicly accessible functions
	return {
		deleteContent: function(original) {
			var deleteContent = removeInit(original);
		},
		replaceContent: function(original, replacement) {
			var replaceContent = new replaceInit(original, replacement);
		},
		hide: function(original) {
			var hide = new hideInit(original);
		},
		remove: function(original) {
			var remove = new removeInit(original);
		},
		replace: function(original, replacement) {
			var replace = new replaceInit(original, replacement);
		},
		append: function(original, replacement) {
			var append = new appendInit(original, replacement);
		},
		prepend: function(original, replacement) {
			var prepend = new prependInit(original, replacement);
		},
		image: function (original, replacement) {
			var src = new srcInit(original, replacement);
		},
		offer: function (target, name) {
			(offerTest == "") ? offerTest = name : offerTest = offerTest;
			(formName == "") ? formName = target : formName = formName; 
			addLoadEvent(offerInit);
		},
		info: function() {
			infoInit();
		}
	};
}();

// Create Date

function createDate() {
	var year = (new Date()).getFullYear();
	document.write(year);
}

/* Makes popUps */
function makePopUp(whereTo,winWidth,winHeight) {
	remote=window.open("","remotewin","width="+winWidth+",height="+winHeight+",menubar=0,toolbar=no,scrollbars=yes");
	remote.location.href=whereTo;remote.focus();
}


function getElement(elementID) {
   if(document.all) {
      return document.all[elementID];
   } else {
      return document.getElementById(elementID);
   }
}

function toggle(divElement) {
	var node = getElement(divElement);
  	if (node.style.display == "") {
     	node.style.display = "none";
  	} else {
  		node.style.display = "";     	
  	}  
}

function trim(stringToTrim) {
	return stringToTrim.replace(/^\s+|\s+$/g,"");
}
