if (typeof(Nanni) == 'undefined' || Nanni == null) {
  Nanni = new Object();
}

Nanni.namespace = function() {
    var a=arguments, o=null, i, j, d;
    for (i=0; i<a.length; i=i+1) {
        d=(""+a[i]).split(".");
        o=Nanni;

        // YAHOO is implied, so it is ignored if it is included
        for (j=(d[0] == "Nanni") ? 1 : 0; j<d.length; j=j+1) {
            o[d[j]]=o[d[j]] || {};
            o=o[d[j]];
        }
    }
    return o;
};


Nanni.namespace("utils");

/* addLoadEvent - replaces window.onload */

Nanni.utils.addLoadEvent = function(func, obj) {
  if (typeof func != 'function') {
    try {console.debug("function called addLoadEvent with a non-function param"); } catch (e) { }
    return;
  }
	var oldonload = window.onload;
	if (typeof window.onload != 'function') {
    if (obj !== undefined) {
      window.onload = function() {
        func.call(obj);
      }
    } else {
  		window.onload = func;
    }
	} else {
		window.onload = function() {
			oldonload();
      if (obj !== undefined) {
  			func.call(obj);
      } else {
        func();
      }
		}
	}
}

Nanni.utils.enableSearchBox = function(sSearchId, sResetText, fnSearchSubmit) {
	var searchbox = document.getElementById(sSearchId);
	if (searchbox) {
		searchbox.onfocus = function() {
			if (searchbox.value == sResetText) {
				searchbox.value = "";
			}
		}
		searchbox.onblur = function() {
			if (searchbox.value == "") {
				searchbox.value = sResetText;
			}
		}
		if(fnSearchSubmit) {
			searchbox.onkeypress = function(e) {
				if (!e) var e = window.event;
				if(e) {
		          if(e.keyCode === 13 || e.which === 13 || e.charCode === 13) {
					if(typeof(fnSearchSubmit) != 'undefined' ) {
						fnSearchSubmit();
					}
		            return false;
		          }
	        	}
			}
		}
	}
}

Nanni.utils.loadScript = function(scriptName, scriptUrl) {
	var scriptNode = document.getElementById(scriptName);
	var head = document.getElementsByTagName("head")[0];
	if ((scriptNode != null) && (head.removeChild)) {
		head.removeChild(scriptNode);
	}
	if (document.createElement) {
		scriptNode = document.createElement('script');
		scriptNode.id = scriptName;
		scriptNode.setAttribute('type', 'text/javascript');
		scriptNode.setAttribute('src', scriptUrl);
		scriptNode.setAttribute('charset', 'UTF-8');
	}
	head.appendChild(scriptNode);
}

Nanni.utils.loadStylesheet = function(cssName, cssUrl) {
	var cssNode = document.getElementById(cssName);
	var head = document.getElementsByTagName("head")[0];
	if ((cssNode != null) && (head.removeChild)) {
		head.removeChild(cssNode);
	}
	if (document.createElement) {
		cssNode = document.createElement('link');
		cssNode.id = cssName;
		cssNode.setAttribute('rel', 'stylesheet');
		cssNode.setAttribute('href', cssUrl);
	}
	head.appendChild(cssNode);
}

/* replaceContent - AJAX */

Nanni.utils.replaceContent = function(elementId, url, interval, reloadCallbackFunc){
	var replacer = new Nanni.utils._contentReplacer(elementId, url, interval, reloadCallbackFunc);
	replacer.update();
}

Nanni.utils._contentReplacer = function(elementId, url, interval, reloadCallbackFunc){
	this.elementId = elementId;
	this.url = url;
	this.reloadCallbackFunc = reloadCallbackFunc;
	if (interval) {
		this.interval = interval;
	} else {
		this.interval = null;
	}
	this.success = function(o){
		if ((o.responseText !== undefined) && (o.responseText != null) && (o.responseText.indexOf("No Data")<0)) {
			var result = o.responseText;
			var el = document.getElementById(elementId);
			var newEL = document.createElement(el.tagName);
			newEL.innerHTML = result;
			// compare to see if new contents are different than current contents
			if (el.innerHTML != newEL.innerHTML) {
				//el.innerHTML = result;
				el.parentNode.replaceChild(newEL, el);
				newEL.id = elementId;
				if (this.reloadCallbackFunc && typeof this.reloadCallbackFunc == "function") {
					this.reloadCallbackFunc();
				}
			}
		}
		if(this.interval != null){
			try {
				setTimeout(this.update.bind(this), this.interval);
      } catch (e) { trace("Somebody tell Mike about this: " + e) }
    }
  }
  this.failure = function(o) {}
  this.update = function(){
    YAHOO.util.Connect.asyncRequest("GET", this.url, this);
  }
}

/* showGrid - display layout grid */

Nanni.utils.showGrid = function() {
  if (location.href.search("grid=true") != -1) {
    var allDivs = document.getElementsByTagName("div");
    for (i=0; i<allDivs.length; i++) {
      if (allDivs[i].className.search("section") != -1) {
        allDivs[i].style.cssText += ' background: url("http://design.Nanni.com/prototypes/redesign/bg_grid.gif") top left';
      }
    }
  }
}

/* popup window */
Nanni.utils.popup = function(url, width, height, toolsInd, wname, _articleId)
{
  var options = "width=" + width + ",height=" + height + ",top=" + ((screen.height - height) / 4).toString() + ",left=" + ((screen.width - width) / 2).toString();
  switch (toolsInd){
    case 1:
      options += ",toolbar=no,status=no,resizable=no,scrollbars=no";
      break;
    case 2:
      options += ",menubar=yes,toolbar=yes,status=yes,resizable=yes,location=yes,scrollbars=yes";
      break;
    case 3:
      options += ",toolbar=no,status=no,resizable=no,scrollbars=yes";
      break;
    default:
      //do nothing
      break;
  }
  if (!wname){
    wname = "NanniPopup";
  }

  if( _articleId == null ) {
	  _articleId = (typeof(Nanni.info) == 'undefined' || Nanni.info == null)? "" : Nanni.info.articleId ;
	}

  switch(wname) {
  	case "emailArticle":
	  	dcsMultiTrack('WT.cg_n', 'Event - Share', 'DCSext.ContentID_Shared', _articleId, 'DCSext.VBC', '', 'DCSext.ContentType', 'Share', 'DCSext.DartZone', '', 'DCSext.ModID', '', 'DCSext.ModImp', '', 'DCSext.rChannel', 'Event', 'dcsuri', '/share');
	  	break;
  	case "shareArticle":
	  	dcsMultiTrack('WT.cg_n', 'Event - Share', 'DCSext.ContentID_Shared', _articleId, 'DCSext.VBC', '', 'DCSext.ContentType', 'Share', 'DCSext.DartZone', '', 'DCSext.ModID', '', 'DCSext.ModImp', '', 'DCSext.rChannel', 'Event', 'dcsuri', '/share');
	  	break;
  }
  popupWindow = window.open(url, wname, options);
  if (popupWindow){
    popupWindow.focus();
  }
}

/* Just do things */

Nanni.utils.addLoadEvent(Nanni.utils.showGrid);
Nanni.utils.addLoadEvent(function() { Nanni.utils.enableSearchBox('searchfield', 'Search') });

Nanni.namespace("lang");

Nanni.lang.isEmpty = function(o) {
  return (o === null) || (typeof o === 'undefined') ||
    ((typeof o == 'string') && (o.length <= 0));
}

Nanni.lang.isNotEmpty = function(o) {
  return !Nanni.lang.isEmpty(o);
}

Nanni.namespace("lang.Arrays");

Nanni.lang.Arrays.remove = function(ar, obj) {
  if (Nanni.lang.isNotEmpty(ar) && Nanni.lang.isNotEmpty(obj)) {
    for (var i = 0; i < ar.length; i++) {
	    if (ar[i] == obj) {
        ar.splice(i, 1);
        return i;
      }
    }
  }
}

trace = function() {
	try {
		console.debug.apply(console, arguments);
	} catch(e) {}
}

Nanni.utils.isLoggedIn = function() {
	if (typeof(YAHOO) != "undefined") {
	  var userId = YAHOO.util.Cookie.get("customerId");
	  loggedIn = ((userId != null) && (userId != "@"));
	} else {
		loggedIn = false;
	}
  return loggedIn;
}

Nanni.utils.login = function() {
	if ((Nanni.info === null) || (typeof Nanni.info === 'undefined')) {
		var thisEdition = "us";
	} else {
		var thisEdition = (Nanni.info.edition.search(/betaus/i) == -1 ? Nanni.info.edition.toLowerCase() : "us");
	}
	if (Nanni.utils.isLoggedIn() == false) {
		var overlayBox = Nanni.utils.showOverlayCurtain(920, 390, 100);
		document.getElementById("overlayMask").onclick = Nanni.utils.closeLogin;
		overlayBox.innerHTML = '<div class="closer" onclick="Nanni.utils.closeLogin()"></div><iframe id="loginFrame" src="https://commerce.'+thisEdition+'.Nanni.com/login/pages/login/loginEmbedded.do?go=' + encodeURIComponent(location.href) + '&success=http://' + location.hostname + '/assets/loginSuccessful" width="900" height="370" marginwidth="0" marginheight="0" scrolling="no" frameborder="0"></iframe>';
	}
}

Nanni.utils.logout = function() {
	if ((Nanni.info === null) || (typeof Nanni.info === 'undefined')) {
		location.href = 'https://commerce.us.Nanni.com/login/pages/login/logout.do?go=' + encodeURIComponent(location.href);
	} else {
		var thisEdition = (Nanni.info.edition.search(/betaus/i) == -1 ? Nanni.info.edition.toLowerCase() : "us");
		location.href = 'https://commerce.'+ thisEdition +'.Nanni.com/login/pages/login/logout.do?go=' + encodeURIComponent(location.href);
	}

}

Nanni.utils.loadHeaderLinks = function() {
	if ((Nanni.info === null) || (typeof Nanni.info === 'undefined')) {
		var thisEdition = "us";
	} else {
		var thisEdition = (Nanni.info.edition.search(/betaus/i) == -1 ? Nanni.info.edition.toLowerCase() : "us");
	}
	if (document.getElementById("utilities")) {
		var utilityHTML = '<ul>';
		if (Nanni.utils.isLoggedIn() == false) {
			utilityHTML += '<li><a href="https://commerce.'+thisEdition+'.Nanni.com/login/pages/login/portfolioLogin.do?go=' + encodeURIComponent(location.href) + '">Login</a></li>';
			utilityHTML += '<li class="last"><a href="https://commerce.'+thisEdition+'.Nanni.com/registration/pages/registration/begin.do?registrationLoginUrl=/login/pages/login/login.do?go=' + encodeURIComponent(location.href) + '">Register</a></li>';
		} else {
			utilityHTML += '<li><a href="https://commerce.'+thisEdition+'.Nanni.com/profile">Profile</a></li>';
			utilityHTML += '<li><a href="https://commerce.'+thisEdition+'.Nanni.com/purchase/mycart.do">My Cart</a></li>';
			utilityHTML += '<li><a href="https://commerce.'+thisEdition+'.Nanni.com/login/pages/login/portfolioLogin.do?go=http://portfolio.'+thisEdition+'.Nanni.com/'+thisEdition.toUpperCase()+'/overview.asp&go_withoutlogin=http://portfolio.'+thisEdition+'.Nanni.com/'+thisEdition.toUpperCase()+'/public/index.asp">Portfolio</a></li>';
			utilityHTML += '<li class="last"><a href="javascript:Nanni.utils.logout();">Logout</a></li>';
		}
		utilityHTML += '</ul>';
		document.getElementById("utilities").innerHTML = utilityHTML;
	}
}
Nanni.utils.addLoadEvent(Nanni.utils.loadHeaderLinks);

Nanni.utils.getQueryStringParameter = function(url, name) {
	var arrUrlParts= url.split("?");
	var sQueryString = "";
	var sReturnValue = "";
	if ( arrUrlParts.length > 1 ) {
		sQueryString = arrUrlParts[1];
		var arrQueryStringParts = sQueryString.split("&");
		for (var iPart = 0; iPart < arrQueryStringParts.length; iPart++) {
			var arrParamParts = arrQueryStringParts[iPart].split("=");
			if ( arrParamParts[0] == name) {
				sReturnValue = arrParamParts[1];
			}
		}
	}
	return sReturnValue;
}

Nanni.utils.replaceQueryStringParam = function(url, name, value) {
	var arrUrlParts= url.split("?");
	var sUrlPrefix = "";
	var sQueryString = "";
	var sReturnQueryString = "";
	sReturnQueryString = url;
	if ( arrUrlParts.length > 1 ) {
		sUrlPrefix = arrUrlParts[0];
		sQueryString = arrUrlParts[1];
		sReturnQueryString = sUrlPrefix;
		var arrQueryStringParts = sQueryString.split("&");
		var existedInQS = false;
		for (var iPart = 0; iPart < arrQueryStringParts.length; iPart++) {
			var arrParamParts = arrQueryStringParts[iPart].split("=");
			if ( arrParamParts[0] == name) {
				arrParamParts[1]=value;
				existedInQS = true;
			}
			if (iPart==0) {
				sReturnQueryString+= "?";
			} else {
				sReturnQueryString+= "&";
			}
			sReturnQueryString+= arrParamParts[0] + "=" + arrParamParts[1];
		}
		if(!existedInQS){ //There was a Query String but it did not contain the requested name/val so tack it on
			sReturnQueryString+="&"+name+"="+value;
		}
	} else {
		sUrlPrefix = arrUrlParts[0];
		sReturnQueryString = sUrlPrefix + "?" + name + "=" + value;
	}
	return sReturnQueryString;
}


Nanni.utils.closeLogin = function() {
	Nanni.utils.hideOverlayCurtain();
	if (Nanni.utils.isLoggedIn() == true) {
		Nanni.tns.reloadLoginStatus();
		Nanni.utils.loadHeaderLinks();
	}
}

Nanni.utils.showOverlayCurtain = function(width, height, top) {
	if (document.getElementById("overlayMask")) {
		document.getElementById("overlayMask").className = '';
		document.getElementById("overlayContents").className = '';
	} else {
		var curtain = document.createElement("div");
		curtain.id = "overlayMask";
		document.body.insertBefore(curtain, document.getElementById("header"));
		var curtainContainer = document.createElement("div");
		curtainContainer.id = "overlayContents";
		document.body.insertBefore(curtainContainer, document.getElementById("overlayMask"));
	}
	top += Nanni.utils.getScrollXY().y;
	var documentHeight = document.getElementById("header").offsetHeight + document.getElementById("content").offsetHeight + 25;
	document.getElementById("overlayMask").style.cssText = "height: " + documentHeight + "px;";
	document.getElementById("overlayContents").style.cssText = "top: " + top + "px; width: " + width + "px; height: " + height + "px; left: " + Math.round((document.getElementById("content").offsetWidth - width)/2) + "px;";
	return document.getElementById("overlayContents");
}

Nanni.utils.hideOverlayCurtain = function() {
	if (document.getElementById("overlayMask")) {
		document.getElementById("overlayMask").className = "hidden";
		document.getElementById("overlayMask").style.cssText = '';
		document.getElementById("overlayContents").className = 'hidden';
		document.getElementById("overlayContents").style.cssText = '';
	}
}

Nanni.utils.getInnerXY = function() {
  var myWidth = 0, myHeight = 0;
  if( typeof( window.innerWidth ) == 'number' ) {
    //Non-IE
    myWidth = window.innerWidth;
    myHeight = window.innerHeight;
  } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
    //IE 6+ in 'standards compliant mode'
    myWidth = document.documentElement.clientWidth;
    myHeight = document.documentElement.clientHeight;
  } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
    //IE 4 compatible
    myWidth = document.body.clientWidth;
    myHeight = document.body.clientHeight;
  }
  return { width: myWidth, height: myHeight };
}

Nanni.utils.getScrollXY = function() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return { x: scrOfX, y: scrOfY };
}

Nanni.utils.printStackTrace = function() {
  var callstack = [];
  var isCallstackPopulated = false;
  try {
    i.dont.exist+=0; //doesn't exist- that's the point
  } catch(e) {
    if (e.stack) { //Firefox
      var lines = e.stack.split("\n");
      for (var i=0, len=lines.length; i<len; i++) {
        if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
          callstack.push(lines[i]);
        }
      }
      //Remove call to printStackTrace()
      callstack.shift();
      isCallstackPopulated = true;
    }
    else if (window.opera && e.message) { //Opera
      var lines = e.message.split("\n");
      for (var i=0, len=lines.length; i<len; i++) {
        if (lines[i].match(/^\s*[A-Za-z0-9\-_\$]+\(/)) {
          var entry = lines[i];
          //Append next line also since it has the file info
          if (lines[i+1]) {
            entry += " at " + lines[i+1];
            i++;
          }
          callstack.push(entry);
        }
      }
      //Remove call to printStackTrace()
      callstack.shift();
      isCallstackPopulated = true;
    }
  }
  if (!isCallstackPopulated) { //IE and Safari
    var currentFunction = arguments.callee.caller;
    while (currentFunction) {
      var fn = currentFunction.toString();
      var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf("(")) || "anonymous";
      callstack.push(fname);
      currentFunction = currentFunction.caller;
    }
  }
  try { console.debug("stacktrace: %o", callstack.join('nn')); } catch (e) { }
}


