LIFEWAY.common = new function(){
	var previousHighlightedItemId = "";
	var previousHighlightedClass = "";
	var bSaf = (navigator.userAgent.indexOf('Safari') != -1);
	var bMoz = (navigator.appName == 'Netscape');
	var monitorFieldId ="";
	var	monitorBuffer =  new Array();
	var callInterval = new Array();
	var	monitorCallback = "";
	var callbackParams;
	var lastTypedTime= new Date();
	var elapsedTime	= 0;
	
	
	return {
	
		showHelp : function() {
			var helpWindow = window.open("/help/home/10","helpWindow","width=950, height=600, toolbar=0, menubar=1, location=0, status=0, scrollbars=1, resizable=1");
			helpWindow.focus();
		},
		
		addToolTips : function(className) {
			var elements = $$('.' + className);
			for(e = 0; e < elements.length; e++) {
				new YAHOO.widget.Tooltip("tt" + e, {context: elements[e].id, text:elements[e].title});
			}
		},
		
		initLiveSearch : function (fieldId, timeout, callback, params) {
			monitorFieldId = fieldId;
			monitorCallback = callback;
			callbackParams = params;
			$(fieldId).onkeydown=this.keyTyped;
			if (!monitorBuffer[fieldId]) monitorBuffer[fieldId] = "";
			callInterval[fieldId] = setInterval(function(){
				elapsedTime = new Date() - lastTypedTime;
				if (monitorBuffer[fieldId] != $(fieldId).value && !$(fieldId).value.blank() && (elapsedTime > 750)) {
					monitorBuffer[fieldId] = $(fieldId).value;
					callback.call(params);
				}
				}, timeout);
		}, 
		cancelLiveSearch : function(fieldId) {
				clearInterval(callInterval[fieldId]);
		},
		keyTyped : function() {
			lastTypedTime = new Date();
		},
		
		setCartTotal: function(subtotalElementArray, destination) {
			var cartTotal = 0;
			subtotalElementArray.each(function(item) {
				cartTotal += parseFloat(item.innerHTML);
			});
			$(destination).innerHTML = cartTotal.toFixed(2);
		},
		
		hasPreference : function(userPrefs,type){
			if (userPrefs){
				for (var i = 0; i < userPrefs.Preference.length; i++){
					if (userPrefs.Preference[i].preferenceId == type) {
						return true;
					}
				}
			}
			return false;
		},
		processValidationErrors : function(errors) {
			if (errors){ 
				LIFEWAY.common.doErrors(errors);
				LIFEWAY.common.displayHomeErrorHeader(errors);
			}
		},
		
		processHomeValidationErrors : function(errors) {
			if (errors){ 
				LIFEWAY.common.displayHomeErrorHeader(errors);
			}
		},
		
		processStackTrace : function(stackTrace) {
			if(stackTrace) {
				$('stackTraceSpan').innerHTML = stackTrace;
				
			} else {
			}
		},
		
		hideDIVElements : function(allTypes, filterType) {
			for (var a=0; a<allTypes.length; a++){
				if(allTypes[a] != filterType){
					Element.hide(allTypes[a] + "Filter");
				}
			}
		},
		
		replaceInnerHTML : function(element, value) {
			document.getElementById(element).innerHTML = value;
		},
				
		//Loop thru all form elements and show/hide selects if IE
		//This is needed to work around IE displaying selects over top of divs - no matter the z-index
		hideSelects : function(action) {
			if (action!='visible'){action='hidden';}
			if (navigator.appName.indexOf("MSIE")) {
				//$('elements_select').style.visibility = action;
				for (var a = 0; a < document.forms.length; a++){
					for (var b = 0; b < document.forms[a].length; b++) {
						if (document.forms[a].elements[b].options) {
							document.forms[a].elements[b].style.visibility = action;
						}
					}
				}
			}
		},
		
		toggleElements : function(elements) {
		    var action;
            for (var i = 0; i < elements.length; i++) {
                if (elements[i].style.visibility == 'visible') {
                    action='hidden';
                } else {
                    action = 'visible';
                }
                elements[i].style.visibility = action;
            }
        },
		
		hideShowCartButton : function(div, otherDiv, type, suffix) {
			if($(div).style.display == 'none'){
				$("addToCart" + type + suffix).style.display = "block";
			} else {
				if(otherDiv === null || $(otherDiv).style.display == 'none') {
					$("addToCart" + type + suffix).style.display = "none";
				} else {
					$("addToCart" + type + suffix).style.display = "block";
				}
			} 
		},
		
		highlight : function(el){
			var highlightItem = el.parentNode.id;
			if(highlightItem == previousHighlightedItemId){
				return;
			}
			$(highlightItem).addClassName("searchResultElement_highlight");
			if($(previousHighlightedItemId) && previousHighlightedItemId != ""){
				$(previousHighlightedItemId).removeClassName("searchResultElement_highlight");
			}
			previousHighlightedItemId = highlightItem;
		},
		
		doErrors : function(errors){
			var errorObj = errors.Exception;
			if (errorObj.Errors && errorObj.Errors.ErrorMessage){
				for (var i=0; i < errorObj.Errors.ErrorMessage.length; i++){
					var errorPlace = 
						document.getElementById(errorObj.Errors.ErrorMessage[i].attribute + 'Error');
					if (errorPlace)
						errorPlace.innerHTML='*&nbsp;';
				}
			}
		},
		
		checkCaps : function(e, el, errorEl){
			//what (case sensitive in good browsers) key was pressed
			var theKey = e.which ? e.which : ( e.keyCode ? e.keyCode : ( e.charCode ? e.charCode : 0 ) );
			//was the shift key was pressed
			var theShift = e.shiftKey ; //bitWise AND
			//if upper case, check if shift is not pressed. if lower case, check if shift is pressed
			var isCapsLock = ( theKey > 64 && theKey < 91 && !theShift ) || 
				( theKey > 96 && theKey < 123 && theShift );
			var pw = document.getElementById(el);
			if (isCapsLock){
				$(errorEl).style.display="block";
			}
			else{
				$(errorEl).style.display="none";
			}
		},
		
		setStackTraceEvent : function(){
			if (window.addEventListener){
				window.addEventListener('keypress', LIFEWAY.common.processStackTraceEvent, true);
			}
			else if (window.attachEvent){
				window.attachEvent('onkeypress', LIFEWAY.common.processStackTraceEvent);
			}
		},
		processStackTraceEvent : function(event){
			var theKey = event.which ? event.which : ( event.keyCode ? event.keyCode : ( event.charCode ? event.charCode : 0 ) );
			if (event.ctrlKey && event.altKey && theKey == 122){
				if ($('stackTrace').style.display == 'block'){
					$('stackTrace').style.display = 'none';
				}
				else{
					$('stackTrace').style.display='block';
				}
			}
		},
		
		displayErrorMessage : function(message){
		      var el = document.getElementById("errorHeader");
		      el.innerHTML = message;
		      Effect.Appear('errorpopup', { duration: 0.3 });
		},
		
		displayError : function(errors, hasListStyle){
			if(!errors){ return }
			var el = document.getElementById("errorHeader");
			var errorObj = errors.Exception;
			
			if(errorObj) {
				if (errorObj.Generic && errorObj.Generic != ""){
					el.innerHTML = errorObj.Generic;
				} else {
					var messageText = "";
					if (errorObj.Errors && errorObj.Errors.ErrorMessage){
						messageText = "<ul>";
						var errorCount = errorObj.Errors.ErrorMessage.length;
						for (var i=0; i < errorCount; i++){
							var listStyle = "";
							if(!hasListStyle){
								listStyle = "style=\"list-style:none\"";
							}
							messageText +=  "<li " + listStyle + ">" + errorObj.Errors.ErrorMessage[i].errorMessage + "</li>";
						}
						messageText += "</ul>";
						if(errorCount == 1 && errorObj.Errors.ErrorMessage[0].errorMessage.length < 30){
							//only one small message - center it
							messageText = "<div style='text-align:center;'>" + messageText + "</div>";
						}
						el.innerHTML = messageText;
					}
				}
				Effect.Appear('errorpopup', { duration: 0.3 });
				
			} else {
				el.style.display='none';
			}
		},
		
		displayErrorHeader : function(errors){
			LIFEWAY.common.displayError(errors, true);
		},
		
		displayHomeErrorHeader : function(errors){
			LIFEWAY.common.displayError(errors, false);
		},
		
		updateEl : function(elName, filler){
			if(filler == null){
				filler = "";
			}
			$(elName).innerHTML = filler;
		},
		
		loadJSON : function(oReq, url){
			var json = "";
			try {
				json = eval('(' + oReq.responseText + ')');
			} catch(err) {
				alert("BAD JSON: " + err);
				document.location = url;
				return null;
			}
			return json;
		},
		
		displaySuccessMessage : function(msg){
			$('successMessage').style.display = 'block';
			$('successMessage').style.visibility = 'visible';
			$('successMessage').innerHTML = msg;
			new Effect.ScrollTo('successMessage');
			setTimeout(LIFEWAY.common.delayMessage, 2000);
		},
		
		delayMessage : function() {
			Effect.Fade('successMessage', { duration: 2.0 });
		},
		
		hasParent : function(node){
			return node && node.parentNode;
		},
		
		executeEmbeddedJS : function(node) {
		  var st = node.getElementsByTagName('SCRIPT');
		  var strExec;
		  for(var i=0;i<st.length; i++) {     
		    if (bSaf) {
		      strExec = st[i].innerHTML;
		    }
		    else if (bMoz) {
		      strExec = st[i].textContent;
		    }
		    else {
		      strExec = st[i].text;
		    }
		    try {
		      eval(strExec.split("<!--").join("").split("-->").join(""));
		    } catch(e) {
		      alert(e);
		    }
		  }
		},
		
		toggleVisibility : function(div, hideVisibility) {
			if(hideVisibility) {
				$(div).style.visibility='hidden';
			} else {
				$(div).style.visibility='visible';
			}
		},
		
		toggleElementImage : function(img){
			var srcName = img.src;
			if (srcName.indexOf('arrow_right.jpg') != -1){
				LIFEWAY.common.toggleElementWithImage(img, "/images/arrow_down.jpg");
				return 'opened';
			} else {
				LIFEWAY.common.toggleElementWithImage(img, "/images/arrow_right.jpg");
				return 'closed';
			}
		},
		
		toggleElementWithImage : function(img, imgSource) {
			img.src = imgSource;
		},
		
		toggleElementDetail : function(index) {
			var currentClass = $("elementTitle_"+index).className;
			if( currentClass == "arrow_down_green"){
				$("elementTitle_"+index).className = "arrow_right_green";
				$("detailArrow_"+index).src = "/images/plan/plan_green_arrow_right.jpg";
				new Effect.Fade('details_'+index, { duration: 0.3 });
			} else {
				$("elementTitle_"+index).className = "arrow_down_green";
				$("detailArrow_"+index).src = "/images/plan/plan_green_arrow_down.jpg";
				new Effect.Appear('details_'+index, { duration: 0.3 });
			}
		},
		
		toggleOtherElementDetail : function(index) {
			var currentClass = $("elementTitle_"+index).className;
			if( currentClass == "arrow_down_blue"){
				$("elementTitle_"+index).className = "arrow_right_blue";
				$("detailArrow_"+index).src = "/images/plan/plan_blue_arrow_right.jpg";
				new Effect.Fade('details_'+index, { duration: 0.3 });
			} else {
				$("elementTitle_"+index).className = "arrow_down_blue";
				$("detailArrow_"+index).src = "/images/plan/plan_blue_arrow_down.jpg";
				new Effect.Appear('details_'+index, { duration: 0.3 });
			}
		},
		
		displayCustomAlertDialog : function(alertText, buttonImageUrl, buttonText, okCallback, okCallbackParams) {
			var processor = getAjaxProcessor("/alertDialog.ajp");
			var params = { 
				alertText : alertText,
				buttonImageUrl : buttonImageUrl,				
				buttonText : buttonText,			
				okCallback : okCallback,				
				okCallbackParams : okCallbackParams				
			};	 
					   
		   	var returnedData = processor(params);
		   	LIFEWAY.dialog.displayDialog(returnedData, 'confirmationMessage');
		},		
		
		displayAlertDialog : function(alertText) {
			LIFEWAY.common.displayCustomAlertDialog(alertText, '/images/buttons/ok.gif', 'Yes', 
				'LIFEWAY.common.removeAlertDialog', []);
		},
		
		removeAlertDialog : function(){
			LIFEWAY.dialog.removeDialog('confirmationMessage');
		},
		
		updateInnerHTMLByClassName : function(className, elementType, root, value){
			element = YAHOO.util.Dom.getElementsByClassName(className, elementType, root);
			element[0].innerHTML=value;
		},
		
		/**
		 * 
		 * @param {Object} selectId - The id of the select box to add the options to.
		 * @param {Object} options
		 * @param {Object} defaultLabel
		 */
		createOptions : function(selectId, options, defaultLabel){
			var j = 0;
			if( defaultLabel != null ){
				$(selectId).options[j] = new Option(defaultLabel, "-1");
				j++;
			}
			
			for( var i = 0; i<options.length; i++, j++) {
				$(selectId).options[j] = new Option(options[i].label, options[i].value);
			}
		},
		      
        /**
         * Use this one if you want to actually select a value in the select box
         * @param {Object} selectedValue - The one that is selected - if null - do nothing
         * @param {Object} selectId - The id of the select box to add the options to.
         * @param {Object} options
         * @param {Object} defaultLabel
         */
        createOptionsWithSelected : function(selectedValue, selectId, options, defaultLabel){
            var j = 0;
            if( defaultLabel != null ){
                $(selectId).options[j] = new Option(defaultLabel, "-1");
                j++;
            }
            
            for( var i = 0; i<options.length; i++, j++) {
                $(selectId).options[j] = new Option(options[i].label, options[i].value);
                if(options[i].value == selectedValue) {
                    $(selectId).options[j].selected = true;
                }
            }
        },
        	
		retrieveElementPositionByElementId : function(array, elementId) {
			var pos = -1;
				for(i = 0; i < array.length; i++){
					if( array[i].id == elementId){
						pos = i;
						break;
					}
				}
			return pos;
		},
			
		redirect : function(href) {
			window.location.href = href;
		},
		
		retrieveStateProvinces : function(countryId,caller) {				
				var url = '/common/stateProvince/'+countryId+'?caller='+caller;			
			   	sendAjaxRequest(url, 'POST', true, null, retrieveStateProvincesSuccess, retrieveStateProvincesFailure);	
		}
		
	};
	

	function retrieveStateProvincesSuccess(oReq) {	
		var responseJSON = eval( '(' + oReq.responseText + ')');
		var list = responseJSON.JSONMessageImpl.message.provinces;
		var parent = document.getElementById('statetd');
		
		if(list != null) 
		{

			  var child1 = document.getElementById('state');	  
			  var child2 = document.getElementById('statetext');	  
			

			  if ( parent.hasChildNodes() )
			  {
			      while ( parent.childNodes.length >= 1 )
			      {
			    	  parent.removeChild( parent.firstChild );       
			      } 
			  }

			
			  
			
			var objSel = document.createElement ("select")
	
			//$('state').options.length = 0;
			objSel.className = "select";   
			//objSel.setAttribute("className","select");
			objSel.setAttribute("id","state");
			if(responseJSON.JSONMessageImpl.message.caller==2)
			{	
				objSel.setAttribute("name","billingAddress.state");
			}else if(responseJSON.JSONMessageImpl.message.caller==3)
	        {
				objSel.setAttribute("name","address.state");
	        }
			else
			{
				objSel.setAttribute("name","state");
			}				
			objSel.options.length = 0;
			for(var i = 0; i < list.StateProvince.length; i++) {
				var stateProvince = list.StateProvince[i];
				objSel.options[i] = new Option(stateProvince.stateProvinceDescription,stateProvince.stateProvinceCode);
			}

	          parent.appendChild(objSel);
		}else if(responseJSON.JSONMessageImpl.message.country == 0)
		{
			
			  var child1 = document.getElementById('state');	  
			  var child2 = document.getElementById('statetext');	  
			
			  if ( parent.hasChildNodes() )
			  {
			      while ( parent.childNodes.length >= 1 )
			      {
			    	  parent.removeChild( parent.firstChild );       
			      } 
			  }

			var objSel = document.createElement ("select")
	
			//$('state').options.length = 0;
			objSel.className = "select";   
			//objSel.setAttribute("className","select");
			objSel.setAttribute("id","state");
			if(responseJSON.JSONMessageImpl.message.caller==2)
			{
				
				objSel.setAttribute("name","billingAddress.state");
			}else if(responseJSON.JSONMessageImpl.message.caller==3)
	        {
				objSel.setAttribute("name","address.state");
	        }
			else
			{
				objSel.setAttribute("name","state");
			}				
			objSel.options.length = 0;
			objSel.options[0] = new Option("--Please Select a Country--",null);
			parent.appendChild(objSel);
		}
		else {
			
			 var child1 = document.getElementById('state');	  
			  var child2 = document.getElementById('statetext');	  
		
			  if ( parent.hasChildNodes() )
			  {
			      while ( parent.childNodes.length >= 1 )
			      {
			    	  parent.removeChild( parent.firstChild );       
			      } 
			  }

			  var objFld = document.createElement("fieldset")			
	          var objInp = document.createElement("input")
	      	 
			  objInp.setAttribute("type","text");
	          objInp.setAttribute("id","statetext");
	          objInp.setAttribute("maxlength",2);
	          objInp.className =  "textfield_shopping_large";
	          if(responseJSON.JSONMessageImpl.message.caller==2)
	          {	
	        	  objInp.setAttribute("name","billingAddress.state");
	          }else if(responseJSON.JSONMessageImpl.message.caller==3)
	          {
	        	  objInp.setAttribute("name","address.state");
	          }
	          else
	          {
	        	  objInp.setAttribute("name","state");  
	          }
	          objFld.appendChild(objInp);
	          parent.appendChild(objFld);
		}
		
		//<form:option label="label" value="value" />
	
	};
	
	function retrieveStateProvincesFailure() {
	
	};

	function publishSearchErrors(oReq) {
		var jsonData = eval('(' + oReq.responseText + ')');
		var errorObj = jsonData.Exception;
		var s = "<p class='bad_warning_text_hdr'>Search Errors</p>";
		s += "<ul class='bad_warning_text'><br/>";
		for(var i=0; i<errorObj.Errors.ErrorMessage.length; i++){
			s += "<li>" + errorObj.Errors.ErrorMessage[i].errorMessage + "</li>";
		}
		s += "</ul>";
		$('searchResultsContainer').innerHTML = s;
	};	
	

}();


