/*	Dependencies:
*/

/* TODO
[] make trim an extension method
[] consider making url subspace
*/

Array.prototype.exists = function(o) {
for(var i = 0; i < this.length; i++)
   if(this[i] === o)
     return true;
return false;
}

var sl = sl || {};

sl.utility = {
	debug : function(msg){
		if(window.location.search.indexOf('debug') >= 0) { alert(msg); }	
	},
	addHistory : function(hashname) {
	    window.location.hash = hashname;
	    var locationHashChanged = function() {
            if (window.location.hash !== "#" + hashname) {
                    window.location.hash = "";
                    window.location.reload();
            }
        }
        window.onhashchange = locationHashChanged;
	},
	growlNotice : function(text,showonce,delaytime,growlname) {
	    var shown = sl.utility.cookie.getSubCookie("showNotice", growlname);
	    if(!showonce || shown != "1") {
            setTimeout(function(){
                var growlchk = document.getElementById("growlbox");
				var a = document.createElement("a");
					a.setAttribute("id", "growlclose");
					a.innerHTML = "Close Window";
					
                if (growlchk == null) {
                    var contentarea = document.getElementById("bodycontent"),
		                growlcontainer = document.createElement("div"),
		                growlcontainerid = document.createAttribute("id"),
		                growlcontent = document.createElement("div"),
		                growlid = document.createAttribute("id");
		                growlcontainerid.value = "growlconatiner";
		                growlid.value = "growlbox";
		            growlcontainer.setAttributeNode(growlcontainerid);
		            growlcontent.setAttributeNode(growlid);
					jQuery(growlcontainer).append(growlcontent);
                    jQuery(growlcontent).append(a);
					jQuery(growlcontent).append(text);
					
                    contentarea.appendChild(growlcontainer);
                } else {                    
					jQuery(growlchk).append(a);
					jQuery(growlchk).append(text);
                }
                
                var growlbox = document.getElementById("growlbox");
                jQuery("#growlbox").css("opacity","0");
                jQuery("#growlbox").animate({opacity : 1}, 500);
	        },delaytime);
	    }
	    if(showonce) {
	         sl.utility.cookie.setSubCookie("showNotice",growlname,"1");  
	    }
	    jQuery("#growlbox").live("click",function(){
	        jQuery("#growlconatiner").animate({opacity : 0}, 500);
	    });
	    
	},
	cloneObject : function(obj){
		var c = obj instanceof Array ? [] : {};
			for (var i in obj) {
				var prop = obj[i];
				if (typeof prop == 'object') {
					if (prop instanceof Array) {
						c[i] = [];
						for (var j = 0; j < prop.length; j++) {
							if (typeof prop[j] != 'object') {
								c[i].push(prop[j]);
							} else {
								c[i].push(sl.utility.cloneObject(prop[j]));
							}
						}
					} else {
						c[i] = sl.utility.cloneObject(prop);
					}
				} else {
					c[i] = prop;
				}
			}
			return c;
	},
	typeOf : function(value){
		var s = typeof value;
		if (s === 'object') {
			if (value) {
				if (value instanceof Array) {
					s = 'array';
				}
			} else {
				s = 'null';
			}
		}
		return s;
	},
	trim : function(str) {
        if(str != null) {
            var x = str;
            x=x.replace(/^\s*(.*)/, "$1");
            x=x.replace(/(.*?)\s*$/, "$1");
            return x;
        }
        return "";
    },
	getUrlParameter : function(param, url) {
		var regex = '[?&]' + param + '=([^&#]*)';
		var results = (new RegExp(regex, "i")).exec(url);
		if(results) return results[1];
			return '';
	},
	

	getQueryString : function(key, defaultvalue) {   
        if(key != null)
            key = key.toLowerCase();
    
        var retval;
        var defval = null;
        if (defaultvalue) defval = defaultvalue;
        
        var qs = document.location.search;
        if(qs != null)
            qs = qs.toLowerCase();
        
        var index = qs.indexOf(key + "=");
        
        if (index == -1) return defval;
        
        index = qs.indexOf("=", index) + 1;
        
        var endstr = qs.indexOf("&", index);
        
        if (endstr == -1) endstr = qs.length;
        
        retval = sl.utility.trim(unescape(qs.substring(index, endstr)).replace(/\+/ig,' '));
        
        if (retval=='') return defval;  // empty string, return default
        
        return retval;
    },
    replaceQS : function(url, name, value){
        var token = "?";
        var index1;
        var index2;         
        var fragment;
        
        index1 = url.indexOf("&" + name + "=");
        if(index1 == -1)
            index1 = url.indexOf("?" + name + "=");
        else
            token = "&";
                    
        if(index1 == -1){
            //param not found
            token = (url.indexOf("?") == -1) ? "?" : "&";
            url = url + token + name + "=" + value;             
        }
        else{
            //param found                               
            index2 = url.indexOf(token, index1+1);      
            if(index2 > -1)
                fragment = url.substr(index2);
            else
                fragment = "";      
            url = url.substring(0, index1) + token + name + "=" + value + fragment;
        }           
            return url
    },
	extractMetaSettings : function(tag,placement) {
        var source = jQuery("meta[name='"+tag+"']").attr("content"),
            temp = new Array();
        temp = source.split('~');
        if(temp[placement]) return temp[placement];
            return null;
    },
    extractCustomWT : function() {
        var source = jQuery("meta[name='sl_wtcustomtracking']").attr("content"),
            temp = new Array();
        if(source != null) {
            temp = source.split('~');
            return temp;
            /*for(var i=0; i<temp.length; i++) {
                var DCS=new Object();
                return temp[i]=temp[i];
                i++;
            }*/
        }
    },
    //This function replaces relative links with absolute ones
    changeLinkType : function(element,attributetype,domain){
        jQuery(element).each(function() {
            var url = jQuery(this).attr(attributetype);
            if (!url.match(/^http/)) {
                jQuery(this).attr(attributetype, 'http://www.'+domain+jQuery(this).attr(attributetype));
            }
        });
    },
	dopopup : function (strPage, lngWidth, lngHeight) {
        var x, y;
        var agt=navigator.userAgent.toLowerCase(); 
      
      // initially assume 640x480
        var screenWidth = 640;
        var screenHeight = 480;

  
        if (window.screen.availHeight) {
            screenWidth = window.screen.availWidth; 
            screenHeight = window.screen.availHeight;
        } else if (window.screen.height) {
            screenWidth = window.screen.width; 
            screenHeight = window.screen.height - 50;
        } else if (document.all) {
            screenWidth = document.body.offsetWidth + window.screenLeft - 15;
            screenHeight = document.body.offsetHeight + window.screenTop - 15;
        } else if (document.layers) {
            screenWidth = window.outerWidth - 20;
            screenHeight = window.outerHeight - 50;
        }
 
        if(lngWidth > screenWidth) lngWidth = screenWidth;
        if(lngHeight > screenHeight) lngHeight = screenHeight;
        x = (screenWidth - lngWidth)/2;
        y = (screenHeight - lngHeight)/2;
        if(x<0) x=0;
        if(y<0) y=0;
      
        window.open(strPage, 'x', 'height='+lngHeight+',width='+lngWidth+',left='+x+',top='+y+',status=no,toolbar=no,menubar=no,location=no,resizable=yes,scrollbars=yes');
    },
	preLoadImage : function(imagepath, returnfunction) {
		if (imagepath !== undefined) {
			var preimg = new Image();
			preimg.onload = returnfunction;
			preimg.src = imagepath;
		}
	}
};

sl.utility.cms = {
/* cms_getQueryString
	 * 
	 * defaultvalue is optional. If passed, then 
	 * if "key" doesn't exist or is "", defaultvalue
	 * is returned. Otherwise null is returned on a mismatch.
	 *
	 */
	getQueryString : function(key, defaultvalue){   
		if(key != null)
			key = key.toLowerCase();
	
		var retval;
		var defval = null;
		if (defaultvalue) defval = defaultvalue;
		
		var qs = document.location.search;
		if(qs != null)
			qs = qs.toLowerCase();
		
		var index = qs.indexOf(key + "=");
		
		if (index == -1) return defval;
		
		index = qs.indexOf("=", index) + 1;
		
		var endstr = qs.indexOf("&", index);
		
		if (endstr == -1) endstr = qs.length;
		
		retval = (unescape(qs.substring(index, endstr)).replace(/\+/ig,' '));//JG  .trim();
		
		if (retval=='') return defval;  // empty string, return default
		
		return retval;
	},
	
	// cms_getCookie
	// defaultvalue is optional. If passed, then 
	// if "key" doesn't exist or is "", defaultvalue
	// is returned. Otherwise null is returned on a mismatch.
	getCookie : function(key, subkey, defaultvalue, nounescape) {
		var retval;
		var defval = null;
		if (defaultvalue != null && defaultvalue != undefined) defval = defaultvalue;
		var strKey = key;
		var strSubKey = '';
		if(subkey) strSubKey = subkey;

		var cookiestr = " " + document.cookie + ';';
		var rx = new RegExp('[^&]' + strKey + '=([^;]+)', 'i');
		if(rx.test(cookiestr)) {
			rx.exec(cookiestr);
			if(strSubKey == '') {
				// no subkey, return the match
				retval = (nounescape) ? RegExp.$1 : unescape(RegExp.$1);
				retval = retval.replace(/\+/ig,' ').trim();
				if (retval == '')
					return defval;  // empty string, return default
				else
					return retval;
			}
			else {
				// get the subkey
				var val = (nounescape) ? RegExp.$1 + '&' : unescape(RegExp.$1 + '&');
				rx = new RegExp(strSubKey + '=([^&]+)', 'i');
				if(rx.test(val)) {
					// it's in there
					rx.exec(val);
					retval = (nounescape) ? RegExp.$1 : unescape(RegExp.$1);
					retval = retval.replace(/\+/ig,' ');//JG .trim();
					if (retval == '')
						return defval;  // empty string, return default
					else
						return retval;
				}
				else {
					// not in there
					return defval;
				}
			}
		}
		else {
			// no match on the key
			return defval;
		}    
	}
}

sl.utility.circular = {
    emailAlerts : function() {
        var emailAddress = sl.utility.cookie.getCookie("QuickHoundEmailAlerts", "NotificationAddress172", null, null);

        if( jQuery("#emailalertsframe").length > 0){
	        if (emailAddress == "" || emailAddress == null) {
	            var emailContainer = document.getElementById("emailalertsframe");
	            var emailTitle = document.createElement("h3");
	                emailTitle.innerHTML = "Email Alerts";
	            var emailFormP = document.createElement("p");
	                emailFormP.innerHTML = "Sign Up for Email Alerts";
	            var emailForm = document.createElement("form");
	                emailForm.setAttribute("method","post");
	                emailForm.setAttribute("action","/"+sl.utility.extractMetaSettings("sl_settings",1)+"/Default.aspx?action=subscribe&storeid=" + sl.utility.extractMetaSettings("sl_settings",2));
	            var emailFormFieldset = document.createElement("fieldset");
	            var emailFormLegend = document.createElement("legend");
	                emailFormLegend.innerHTML = "Sign up & get notified of new specials";
	            var emailFormLabel = document.createElement("label");
	                emailFormLabel.setAttribute("for","emailinput");
	            var emailFormInput = document.createElement("input");
	                emailFormInput.setAttribute("id","emailinput");
	                emailFormInput.setAttribute("name","eddmailaddress");
	                emailFormInput.setAttribute("type","text");
	                emailFormInput.setAttribute("value","your email address");
	            var emailFormSubmit = document.createElement("input");
	                emailFormSubmit.setAttribute("type","submit");
	                emailFormSubmit.setAttribute("id","emailsignupbtn");
	                emailFormSubmit.setAttribute("value","Sign Up");
	            emailContainer.appendChild(emailTitle);
	            emailContainer.appendChild(emailFormP);
	            emailForm.appendChild(emailFormFieldset);
	            emailFormFieldset.appendChild(emailFormLegend);
	            emailFormFieldset.appendChild(emailFormLabel);
	            emailFormFieldset.appendChild(emailFormInput);
	            emailFormFieldset.appendChild(emailFormSubmit);
	            emailContainer.appendChild(emailForm);
	            jQuery("#emailinput").focus(function(){
	                jQuery(this).val("");
	            });   
	        } else {
	            var emailContainer = document.getElementById("emailalertsframe");
	            var emailTitle = document.createElement("h3");
	                emailTitle.innerHTML = "Email ALerts";
	            var emailModify = document.createElement("a");
	                emailModify.setAttribute("href","/"+sl.utility.extractMetaSettings("sl_settings",1)+"/Default.aspx?action=modify&storeid=" + sl.utility.extractMetaSettings("sl_settings",2));
	                emailModify.innerHTML = "Modify Your Subscription >";
	            emailContainer.appendChild(emailTitle);
	            emailContainer.appendChild(emailModify);
	        }
        }  
    },
    getPageCounter : function() {
        return sl.utility.cookie.getCookie("SLHPageCounter");
    },
    setPreferredMode : function(mode) {
        if(mode == "flash") {
            sl.utility.cookie.setSubCookie("DisplayMode","preferred","flash",1000);
        } else {
            sl.utility.cookie.setSubCookie("DisplayMode","preferred","html",1000);
        }
    },
    //Used when linking to circular
    handleEntryToggle : function(link) {   
        var displayMode = ( sl.utility.cookie.getSubCookie("DisplayMode","preferred", null)),
            prefMode = displayMode,
            defaultView = sl.utility.getUrlParameter("defaultMode",link),
            circularAction = sl.utility.getUrlParameter("action",link);   
		
        if (displayMode == null){
            sl.utility.cookie.setSubCookie("DisplayMode","preferred",displayMode,1000);
        } 
        
		if (displayMode != "html"){
            circularAction = "browsepageflash";
        }
        var link1 = link.split("&");
        link1[0] = circularAction;
        window.location = "Default.aspx?action=" + link1.join( '&' ); 
    },
    //Used for nav area toggle
    writeEntryToggle : function(onlyOnBrowse,element,htmltext,flashtext,defaulthtmlmode,defaultbrowsemode) {
        var displayMode = ( sl.utility.cookie.getSubCookie("DisplayMode","preferred", null)),
            curMode = sl.utility.getUrlParameter("action",window.location);
        
        if(onlyOnBrowse) {
            if(curMode != "browsepagesingle" || curMode != "browsepagespread" || curMode != "browsepagelarge")   
                jQuery("#sitetoggle").hide();
        }
            
        if(displayMode == null || displayMode == "") {
            if(curMode == "browsepageFlash") {
                displayMode = "flash";
                sl.utility.circular.setPreferredMode("flash");
            } else if(curMode == "browsepagesingle" || curMode == "browsepagespread" || curMode == "browsepagelarge") {
                displayMode = "html";
                sl.utility.circular.setPreferredMode("html");
            } else {
                displayMode = defaultbrowsemode;
                sl.utility.circular.setPreferredMode(defaultbrowsemode);
            }
        }   
        var rawUrl = new String(window.location);
        var curUrl = rawUrl.split("&");
        var accessibleNotice = document.createElement("span");
            accessibleNotice.setAttribute("class","accessiblehide");
            accessibleNotice.innerHTML = "* Active: ";
            
        if(displayMode == "flash") {
            curUrl[0] = defaulthtmlmode;
            var a = document.createElement("a");
				a.setAttribute("id", "htmllink");
				a.setAttribute("href","Default.aspx?action=" + curUrl.join('&'));
				a.innerHTML = htmltext;
			var sp = document.createElement("span");
			    sp.appendChild(accessibleNotice);
			    sp.innerHTML += flashtext;
		    jQuery(element).html("");
			jQuery(element).append(a);
		    jQuery(element).append(sp);
		    
        } else {
            curUrl[0] = "browsepageflash";
            var a = document.createElement("a");
				a.setAttribute("id", "flashlink");
				a.setAttribute("href","Default.aspx?action=" + curUrl.join('&'));
				a.innerHTML = flashtext;
			var sp = document.createElement("span");
			    sp.appendChild(accessibleNotice);
			    sp.innerHTML += htmltext;
			jQuery(element).html("");
		    jQuery(element).append(a);
		    jQuery(element).append(sp);
        }
        
        jQuery(element + " a").click(function() {
            if(jQuery(this).attr("id") == "flashlink") {
                 sl.utility.cookie.setSubCookie("DisplayMode","preferred","flash",1000);
            } else {
                sl.utility.cookie.setSubCookie("DisplayMode","preferred","html",1000);
            }
	    });
    },
    returnFromListing : function() {
        var url = sl.utility.getUrlParameter("ref", null);
        var cookieURL = unescape(unescape(sl.utility.cookie.getSubCookie("Prefs","SLHListingRedirect","", true)));
        
        if((url == null || url == "") && cookieURL != "") {
            url = cookieURL;
        } else {
            document.location.href = "default.aspx?action=entry";
            return;
        }

	    if(url.lastIndexOf("action=browsepageflash") > -1) {
		    var temp = url.split("pagenumber")[0] + "startpage" + url.split("pagenumber")[1] + "&isp=y";
		    url = temp;
	    }
        document.location.href = url;
    },
    setRollovers : function(showHighlight, staticmode) {
        if(showHighlight)
            jQuery('.circularimg img').maphilight();
    
        var activeRollover;
        var source;
        var delayshow;
        
		function hideRollover() {
			clearTimeout(delayshow);
			var srcdiv = null
			var delayremove = setTimeout(function(){
				srcdiv = jQuery(".activepopdiv").attr("id");
				if(srcdiv != undefined && srcdiv.length > 0) {
					sl.tracking.rollover.dequeueRolloverTracking( jQuery("area#a"+srcdiv.substr(1)).attr('sl:maplistingid'));
				}
				jQuery(".activepopdiv").removeClass("activepopdiv");
				clearTimeout(delayremove);
			},200);
		}
		
		function showRollover(xpos, ypos) {
			if(activeRollover) {
				activeRollover.css({"display":"block","left":xpos+ 5 +"px","top":ypos+ 15+"px"});
			
				if(xpos - jQuery(".circularimg")[0].offsetLeft >  jQuery(".circularimg img").width() - jQuery(".popdiv").width()) {
					activeRollover.css({"display":"block","left":xpos - jQuery(".popdiv").width() +"px"});
				}
				
				if(ypos - jQuery(".circularimg")[0].offsetTop > jQuery(".circularimg img").height() - jQuery(".popdiv").height()) {
					if(!staticmode) {
						activeRollover.css({"display":"block","top":ypos- jQuery(".popdiv").height()+"px"});  
					}
				}
			}         
		}
		
        jQuery("area").mouseenter(function(e) {
		
			jQuery(".activepopdiv").removeClass("activepopdiv");
		
            var visiblesrc = jQuery(".activepopdiv");
            var source = jQuery(this).attr("id");
            var areasrc = jQuery(this);
            var coordssrc = jQuery(this).attr("coords");
            var coords = coordssrc.split(",");
            var areawidth = coords[2] - coords[0];
            var areaheight = coords[3] - coords[1];
            
            if(visiblesrc.length > 0) {
                visiblesrc.removeClass("activepopdiv");
                delayshow = setTimeout(function(){ 
                        sl.tracking.rollover.queueRolloverTracking(sl.utility.extractMetaSettings("sl_settings",0), sl.utility.extractMetaSettings("sl_settings",2), areasrc.attr('sl:mapareaid'), areasrc.attr('sl:maplistingid'), areasrc.attr('sl:mapimpressionwait'));
                        activeRollover.addClass("activepopdiv");
                        clearTimeout(delayshow);
                },500);
            } else {
                activeRollover = jQuery("div#d"+source.substr(1));
                if(jQuery("div#d"+source.substr(1)).length > 0) {
                    delayshow = setTimeout(function(){
                        sl.tracking.rollover.queueRolloverTracking(sl.utility.extractMetaSettings("sl_settings",0), sl.utility.extractMetaSettings("sl_settings",2), areasrc.attr('sl:mapareaid'), areasrc.attr('sl:maplistingid'), areasrc.attr('sl:mapimpressionwait'));
                        activeRollover.addClass("activepopdiv");
                        clearTimeout(delayshow);
                    },500);
                }
                
            }
			if(staticmode) {
				showRollover(e.pageX, (e.pageY - 55));
				
				jQuery(activeRollover).mouseleave(function () {
					hideRollover();
				});
				
				
			}
        });
		
		jQuery(".circularimg").mouseleave(function() {
			hideRollover();
		});
        
		if(staticmode === false) {
			jQuery("area").mouseleave(function(){
				hideRollover();
			});
		}
		
		if(staticmode === false) {
			jQuery(".circularimg").mousemove(function(e){
				showRollover(e.pageX, e.pageY);
			});
		}
			
    }
}

sl.utility.shoppingList = {
    drawShoppingListCount: function (itemPhrase, itemPhrasePlural, node, align) {
        if (itemPhrase == null) {
            itemPhrase = "item";
        }

        if (itemPhrasePlural == null) {
            itemPhrasePlural = "items";
        }

        if (align == null) {
            align = "left";
        }


        var itemCount = sl.utility.shoppingList.shoppingListCount();
        // Add User Notes to Count
        var userCount = sl.utility.cookie.getCookie("ShoppingListUserCount", null, 0);
        if (userCount != null) {
            itemCount = parseInt(itemCount) + parseInt(userCount);
        }

        var itemPhrase = (itemCount == "1") ? " " + itemPhrase : " " + itemPhrasePlural;
        if (sl.utility.trim(itemPhrase) == "") {
            itemPhrase = "";
        }

        if (document.getElementById(node) != null) {
            switch (align) {
                case "right":
                    document.getElementById(node).innerHTML = itemPhrase + " (" + itemCount + ")";
                    break;

                case "left":
                default:
                    document.getElementById(node).innerHTML = itemCount + itemPhrase;
                    break;
            }

        }
    },

    shoppingListCount: function (vdir) {
        if (vdir == null) {
            try { vdir = window.location.href.split('/')[3]; } catch (e) { vdir = ""; }
            if (sl.utility.cookie.getCookie("slc" + vdir) != null) {
                return sl.utility.cookie.getCookie("slc" + vdir, null, "0");
            }
            else {
                return sl.utility.cookie.getCookie("ShoppingListCount", null, " ");
            }
        }
        else {
            return sl.utility.cookie.getCookie("ShoppingListCount", null, " ");
        }
    },

    setText: function (addtext, removetext) {

        // Setup Links
        jQuery('.shoppinglistlink a').each(function () {
            var url = jQuery(this).attr("href"),
            listlink = jQuery(this),
            action = sl.utility.getUrlParameter("action", url),
            splitlink = url.split("&storeid"),
			slhcookie = sl.utility.cookie.getCookie("ShoppingList", null, " "),
			slhcookiesplit,
			slhitemsplit,
            slhcookiesplitcharcheck,
			i;

            if (!slhcookie) {
                sl.utility.cookie.setCookie("ShoppingList", "", "", true);
            }

            if (action == "addshoppinglist") {
                listlink.text(addtext);
                listlink.addClass("addtolist");
            } else if (action == "removeshoppinglist") {
                listlink.text(removetext);
                listlink.addClass("removefromlist");
            } else {
                //we cannot find an action
                if (slhcookie !== null) {
                    var match = new RegExp("%7c", "ig");
                    slhcookiesplit = slhcookie;
                    slhcookiesplit = slhcookiesplit.replace(match, "%2c");
                    slhcookiesplit = slhcookiesplit.split("%2c")
                    slhitemsplit = jQuery(this).parent("li").attr("id").split("slitem_");
                    for (i = 0; i < slhcookiesplit.length; i++) {
                        if (slhcookiesplit[i][0] == undefined) {
                            slhcookiesplitcharcheck = slhcookiesplit[i].charAt(0);
                        } else {
                            slhcookiesplitcharcheck = slhcookiesplit[i][0];
                        }
                        if (slhitemsplit[1] == slhcookiesplit[i] && slhcookiesplitcharcheck == "-") {
                            listlink.text(removetext);
                            listlink.addClass("removefromlist");
                        }
                        if (i == slhcookiesplit.length - 1) {
                            if (jQuery(listlink).attr("class") == "") {
                                listlink.text(addtext);
                                listlink.addClass("addtolist");
                            }
                        }
                    }
                } else {
                    listlink.text(addtext);
                    listlink.addClass("addtolist");
                }
            }
        });

        // Shopping List Link Action 
        jQuery('.shoppinglistlink a').click(function (e) {
            var url = jQuery(this).attr("href"),
            listlink = jQuery(this),
            action = sl.utility.getUrlParameter("action", url),
            splitlink = url.split("&storeid"),
			slhcookie = sl.utility.cookie.getCookie("ShoppingList", null, " "),
			slhcookiesplit,
			slhitemsplit,
			itemListingID;

            if (!slhcookie) {
                sl.utility.cookie.setCookie("ShoppingList", "", "", true);
            }

            if (slhcookie != null) {
                slhcookiesplit = slhcookie.split("%2c");
            }


            if (url != "#") {
                itemListingID = sl.utility.getUrlParameter("listingid", jQuery(this).attr("href"));
            }
            else {
                slhitemsplit = jQuery(this).parent("li").attr("id").split("slitem_");
                itemListingID = slhitemsplit[1];
            }

            // Tracking
            /*if (jQuery(this).hasClass("addtolist")) {
            var urlTrack = [];
            urlTrack[0] = "http://ptsc.shoplocal.com/pt" + document.location.pathname + sl.utility.replaceQS(sl.tracking.pixeltracking.generatePTQS(), "action", "addshoppinglist") + "&pagecounter=" + sl.utility.circular.getPageCounter() + "&slhlogon=" + sl.utility.cookie.getSubCookie("SLHUID", "UID") + "&siteid=" + sl.utility.cookie.getSubCookie("Prefs", "SiteID") + "&referrer=" + escape(document.location) + "&random=" + escape(Math.random());
            sl.tracking.pixeltracking.drawTracker(urlTrack, "pt", "pixelTrackerContainer", false);

            urlTrack[0] = "http://it.shoplocal.com/it.ashx?" + uid + "|~|" + sl.utility.cookie.getSubCookie("Prefs", "SiteID") + "|~|8|~||~|" + sl.utility.cookie.getSubCookie("Prefs", "StoreID") + "|~|" + itemListingID + "|~|" + escape(Math.random()).replace(".", "");
            sl.tracking.pixeltracking.drawTracker(urlTrack, "et", "pixelTrackerContainer", false);

            if(!jQuery(this).hasClass("v2Tracking")){
            sl.tracking.webtrends.dcsMultiTrack('DCS.sl_ffunc', 'addshoppinglist', 'DCSext.sl_zip', '', 'DCSext.sl_zipcnt', '', 'DCSext.sl_circ', '', 'DCSext.sl_circ_p', '', 'DCSext.sl_tx_s', '', 'WT.oss', '', 'WT.oss_r', '', 'WT.tx_u', '1', 'WT.pn_sku', itemListingID, 'WT.si_n', '', 'WT.si_p', '', 'WT.tx_e', 'lp', 'WT.cg_n', 'Shopping List', 'WT.cg_s', 'addshoppinglist');
            }else{
            sl.tracking_v2.trackShoppingListAdd(itemListingID);
            }
            }
            if (jQuery(this).hasClass("removefromlist")) {
            if(!jQuery(this).hasClass("v2Tracking")){
            sl.tracking.webtrends.dcsMultiTrack('DCS.sl_ffunc', 'removeshoppinglist', 'DCSext.sl_zip', '', 'DCSext.sl_zipcnt', '', 'DCSext.sl_circ', '', 'DCSext.sl_circ_p', '', 'DCSext.sl_tx_s', '', 'WT.oss', '', 'WT.oss_r', '', 'WT.tx_u', '1', 'WT.pn_sku', itemListingID, 'WT.si_n', '', 'WT.si_p', '', 'WT.tx_e', 'lp', 'WT.cg_n', 'Shopping List', 'WT.cg_s', 'removeshoppinglist');
            }else{
            sl.tracking_v2.trackShoppingListRemove(itemListingID);
            }
            }*/

            if (url == "#") {

                //build url
                if (jQuery(this).hasClass("addtolist")) {
                    //add
                    url = "default.aspx?action=addshoppinglist&storeid=" + sl.utility.getUrlParameter("storeid", window.location) + "&listingid=" + slhitemsplit[1] + "";
                    listlink.text(removetext);
                    listlink.attr("class", "removefromlist");
                } else {
                    //remove
                    url = "default.aspx?action=removeshoppinglist&storeid=" + sl.utility.getUrlParameter("storeid", window.location) + "&listingid=" + slhitemsplit[1] + "";
                    listlink.text(addtext);
                    listlink.attr("class", "addtolist");
                }
            }

            jQuery.ajax({
                type: "POST",
                url: url,
                dataType: "html",
                success: function (msg) {
                    if (jQuery(listlink).attr("href") != "#") {
                        sl.utility.shoppingList.changeLinkText(listlink, true, addtext, removetext);
                    }
                },
                error: function () {
                    sl.utility.errorManager.showError("Sorry, an error has occured. Please try again.");
                }

            });
            e.preventDefault();
        });
    },
    changeLinkText: function (btntochangewrapper, usetracking, addtext, removetext) {
        if (jQuery(btntochangewrapper).length > 0) {
            //Determine what selector to use, object passed or do we need to transverse
            var sllink = (jQuery(btntochangewrapper).attr("href")) ? jQuery(btntochangewrapper) : jQuery(btntochangewrapper).children("a");
            slurl = sllink.attr("href"),
                splitlink = slurl.split("&storeid"),
                sllinkaction = sl.utility.getUrlParameter("action", slurl);
            if (sllinkaction != "addshoppinglist") {
                sllink.text(addtext);
                sllink.attr("href", "/" + sl.utility.extractMetaSettings("sl_settings", 1) + "/default.aspx?action=addshoppinglist&storeid" + splitlink[1]);
                sllink.addClass("addtolist").removeClass("removefromlist");
                if (usetracking) {
                    if (jQuery(btntochangewrapper).hasClass("v2Tracking"))
                        sl.tracking_v2.trackShoppingListRemove(sl.utility.getUrlParameter("listingid", slurl), sl.utility.getUrlParameter("finalprice", slurl));
                    else
                        sl.tracking.shoppinglist.removeShoppingList(sl.utility.extractMetaSettings("sl_settings", 2), sl.utility.getUrlParameter("listingid", slurl), sl.utility.getUrlParameter("offerid", slurl));
                }
            } else {
                sllink.text(removetext);
                sllink.attr("href", "/" + sl.utility.extractMetaSettings("sl_settings", 1) + "/default.aspx?action=removeshoppinglist&storeid" + splitlink[1]);
                sllink.addClass("removefromlist").removeClass("addtolist");
                if (usetracking) {
                    if (jQuery(btntochangewrapper).hasClass("v2Tracking"))
                        sl.tracking_v2.trackShoppingListAdd(sl.utility.getUrlParameter("listingid", slurl), sl.utility.getUrlParameter("finalprice", slurl));
                    else
                        sl.tracking.shoppinglist.addShoppingList(sl.utility.extractMetaSettings("sl_settings", 2), sl.utility.getUrlParameter("listingid", slurl), sl.utility.getUrlParameter("offerid", slurl), slurl);
                }
            }
        }
    },
    showSmoke: function (e, u) {
        var container = document.getElementById("mainbodywrapper");
        var poof = document.createElement("div");
        poof.setAttribute("class", "poof");
        container.appendChild(poof);

        var xOffset = 24;
        var yOffset = 24;

        u.helper.fadeOut('fast');

        jQuery('.poof').css({
            left: e.pageX - xOffset + 'px',
            top: e.pageY - yOffset + 'px'
        }).show();
        sl.utility.shoppingList.animatePoof();
    },
    animatePoof: function () {
        var bgTop = 0; // initial background-position for the poof sprit is '0 0'
        var frames = 5; // number of frames in the sprite animation
        var frameSize = 32; // size of poof <div> in pixels (32 x 32 px in this example)
        var frameRate = 80; // set length of time each frame in the animation will display (in milliseconds)

        for (i = 1; i < frames; i++) {
            jQuery('.poof').animate({
                backgroundPosition: '0 ' + (bgTop - frameSize) + 'px'
            }, frameRate);
            bgTop -= frameSize;
        }
        setTimeout("jQuery('.poof').hide()", frames * frameRate);
    },

    removeAndHideBrowseShoppinglistItem: function (e, shoppinglistInstructions, itemCounts) {
        // shoppinglistInstructions - container for ShoppingList Instructions on empty list state
        // itemCounts - container(s) for ShoppingList Counts to update when removing

        // Prevent too many quick actions

        if (jQuery("#browseshoppinglist div[id],#browseshoppinglist div[class]").is(':animated')) {
            return false;
        }

        var itemURL = jQuery(e.target).attr("href");
        var removeID = sl.utility.getUrlParameter("listingid", itemURL);
        var shoppingListCount = sl.utility.shoppingList.shoppingListCount();
        var shoppingListTemp = unescape(sl.utility.cookie.getCookie("ShoppingList"));
        var shoppingListTempArray = shoppingListTemp.split(",-");
        var shoppingListNew = "";

        // Fade Animate the listing out and/if display Empty List Instructions
        jQuery(e.target).closest(".productthumbnail").animate({ opacity: 0.0 }, 300, function () {
            jQuery(e.target).closest(".productthumbnail").slideUp(300, function () {
                //tracking
                //var url = [];
                //url[0] = "http://ptsc.shoplocal.com/pt" + document.location.pathname + sl.utility.replaceQS(sl.tracking.pixeltracking.generatePTQS(), "action", "removeshoppinglist") + "&pagecounter=" + sl.utility.circular.getPageCounter() + "&slhlogon=" + sl.utility.cookie.getSubCookie("SLHUID", "UID") + "&siteid=" + sl.utility.cookie.getSubCookie("Prefs", "SiteID") + "&referrer=" + escape(document.location) + "&random=" + escape(Math.random());
                //sl.tracking.pixeltracking.drawTracker(url, "pt", "pixelTrackerContainer", false);
                sl.tracking.webtrends.dcsMultiTrack('DCS.sl_ffunc', 'removeshoppinglist', 'DCSext.sl_zip', '', 'DCSext.sl_zipcnt', '', 'DCSext.sl_circ', '', 'DCSext.sl_circ_p', '', 'DCSext.sl_tx_s', '', 'WT.oss', '', 'WT.oss_r', '', 'WT.tx_u', '1', 'WT.pn_sku', removeID, 'WT.si_n', '', 'WT.si_p', '', 'WT.tx_e', 'lp');

                // Find and remove item from current Shopping List
                for (var i = 0; i < shoppingListTempArray.length; i++) {
                    if (shoppingListTempArray[i].indexOf("-") != 0) {
                        shoppingListTempArray[i] = "-" + shoppingListTempArray[i];
                    }
                    if (shoppingListTempArray[i].indexOf(removeID) == -1) {
                        if (shoppingListNew != "") {
                            shoppingListNew += ",";
                        }
                        shoppingListNew += shoppingListTempArray[i];
                    }
                }
                // Update cookie Shopping List and Shopping List Counts
                sl.utility.cookie.setCookie("ShoppingListCount", shoppingListCount - 1, 1000, true);
                sl.utility.cookie.setCookie("ShoppingList", escape(shoppingListNew), 1000, true);

                // Update the visible Shopping List Counts that are passed in through itemCounts
                if (itemCounts != null) {
                    for (var i = 0; i < itemCounts.length; i++) {
                        sl.utility.shoppingList.drawShoppingListCount("", "", itemCounts[i]);
                    }
                }

                if (sl.utility.shoppingList.shoppingListCount() == "0" && jQuery("#mccatITEMLIST").length == 0) {
                    // when empty shoppinglist show instructions
                    try {
                        jQuery(shoppinglistInstructions).fadeIn(300);
                    } catch (e) { }
                }
            });
        });
        return false;
    },

    clearAdvanceShoppingList: function (storeid, redirect, uid) {
        // Clears ShoppingList Items and User Notes
        // Client needs custom redirect.ascx with override for RemoveAllUserShoppingList()
        sl.utility.cookie.setCookie("shoppinglistnotes", "", 1000, true);
        sl.utility.cookie.setCookie("ShoppingListTotal", "", 1000, true);
        sl.utility.cookie.setCookie("TotalShoppingListPrice", "", 1000, true);
        sl.utility.cookie.setCookie("TotalShoppingListCount", "", 1000, true);
        sl.utility.cookie.setCookie("ShoppingList", "", 1000, true);
        sl.utility.cookie.setCookie("ShoppingListCount", "0", 1000, true);
        if (redirect != null) {
            if (uid != null) {
                uid = "&uid=" + uid;
            }
            document.location.href = "default.aspx?action=removeusershoppinglistall" + uid + "&storeid=" + storeid + "&redirect=" + escape(redirect);
        }
    },

    updateQTY: function (prefix) {
        jQuery("." + prefix).each(function () {
            var listingID = jQuery(this).attr("id").replace(prefix + "_", "");
            var qty = sl.utility.cookie.getSubCookie("ShoppingListTotal", listingID, "1");
            jQuery(this).html("Qty: " + qty);
        });
    },

    printShoppingListShowImages: function (bool) {
        sl.utility.cookie.setSubCookie("Prefs", "printthumbimages", bool, 1000);
    }

}

sl.utility.cookie = {
    getCookie: function(Name, subName) {        
        var search = Name + "="
        var CookieString = document.cookie
        var result = null
        if (CookieString.length > 0) {
            offset = CookieString.indexOf(search)
            if (offset != -1) {
                offset += search.length
                end = CookieString.indexOf(";", offset)
                if (end == -1) {
                    end = CookieString.length
                }
                result = CookieString.substring(offset, end)
            }
        }
        return result;
    },
    getSubCookie: function(name, subname, nullDefault) {
        var tmpCookie = this.getCookie(name);
        if (tmpCookie) {
            uCookies = (tmpCookie.split("&"));
            var found = -1;
            for (i = 0; i < uCookies.length; i++) {
                if (uCookies[i].indexOf(subname) != -1) {
                    var start = uCookies[i].indexOf("=");
                    return uCookies[i].substring(start + 1);
                }
            }
        }
        if(nullDefault) return nullDefault;
    },
    setSubCookie: function(uName, name, value, timeexpire) {
        try {
            if (doNotSetSLHRedirect) { return; }
        }
        catch (e) { }
        uValue = sl.utility.cookie.getCookie(uName, null, null, true);
        if (uValue) {
            uCookies = uValue.split("&");
            var found = -1;
            var stopper = 0;
            for (c = 0; c < uCookies.length; c++) {
                t = uCookies[c].split('=');
                if (t[0] == name) {
                    found = 1;
                    stopper = c;
                    t[1] = escape(value);
                    uCookies[c] = t.join('=');
                    break;
                }
            }
            if (found == 1) {
                uCookies[stopper] = name + '=' + value;
                uValue = uCookies.join('&');
            } else {
                uValue += ("&" + name + '=' + value);
            }
        } else {
            uValue = name + '=' + value;
        }

        if (timeexpire) {
            sl.utility.cookie.setCookie(uName, uValue, timeexpire, true);
        } else {
            sl.utility.cookie.setCookie(uName, uValue, null, true);
        }
    },
    setCookie: function(key, value, daysexpire, noescape) {
        var value = (noescape) ? value : escape(value);
        if (daysexpire) {
            var today = new Date();
            var expires = new Date();
            expires.setTime(today.getTime() + 3600000 * 24 * daysexpire);
            document.cookie = escape(key) + "=" + value + ";expires=" + expires.toGMTString() + ";path=/";
        }
        else {
            document.cookie = escape(key) + "=" + value + ";path=/";
        }
    }
}

sl.utility.accessibility = {
    //Accessibily submit forms without a submit button 
    submitForm : function(form,formelementitem,callback) {
        var formelement = jQuery(formelementitem);
        jQuery(formelement).keypress(function (e) {
            if (e.which == 13) { actiondo() }
        });
        
        jQuery(formelement).change(function(){
            actiondo();
        });
        
        function actiondo() {
            return callback();
        }
   
    }
}

sl.utility.errorManager = {
	showError : function(message) {
		sl.utility.growlNotice("<div id='errormessage'>"+message+"</div>",false,1000,"errormsg");
	}
}

sl.utility.UI = {
    accordionNav : function(container,linkitems,defaultview,pageurl) {
        //Container is what the menu rests in, link items are each link that opens a section, specify in dom order which linkitem shows first, location of primary URL
        var pageAction = sl.utility.getUrlParameter("action", pageurl);
        //Menu link event handler
        jQuery(".menuitem").click(function(){
            if(!jQuery(this).hasClass("active")) {
            
                jQuery.each(jQuery(linkitems), function(index){    
                    jQuery(this).toggleClass("active");
                    //hide all menu items
                     jQuery(jQuery(this).attr("href")).hide(500);
                });
                
                jQuery(this).addClass("active");
                //show only active menu item
                jQuery(jQuery(this).attr("href")).show(500);
            }
            return false; 
        });
        
        //Initialize function
        jQuery.each(jQuery(linkitems), function(index){    
            var exception = "";
            if(pageAction == "browsecategoryl2" || pageAction == "browsecategoryl1") {
                exception = "#categorylist";
            }
            if(pageAction == "browsebrand") {
                exception = "#brandlist";
            }
            
            if( (jQuery(this).attr("href") == exception) || exception == "" && index == defaultview) {
                jQuery(this).addClass("active");
            } else {
                jQuery(jQuery(this).attr("href")).hide();
                
            } 
        });
    }
}

sl.utility.validations = {
    presence : function(form,formelement,callback) { 
        jQuery(form).submit(function(e) {
            if(jQuery(this).children(formelement).val() == "") {  
                e.preventDefault();
                return callback();
            };
        });
    }
}

sl.utility.array = {
    any: function(a, f) {
        for (var x = 0; x < a.length; x += 1) {
            if (f(a[x])) {
                return true;
            }
        }
        return false;
    },
    where: function(a, f) {
        var temp = [], x;
        for (x = 0; x < a.length; x += 1) {
            if (f(a[x])) {
                temp.push(a[x]);
            }
        }
        return temp;
    },
    first: function(a, f) {
        for (var x = 0; x < a.length; x += 1) {
            if (f(a[x])) {
                return a[x];
            }
        }
        return null;
    }
}
