
/* Copyright (c) 2006 Patrick Fitzgerald */
function tabberObj(argsObj)
{var arg;this.div=null;this.classMain="tabber";this.classMainLive="tabberlive";this.classTab="tabbertab";this.classTabDefault="tabbertabdefault";this.classNav="tabbernav";this.classTabHide="tabbertabhide";this.classNavActive="tabberactive";this.titleElements=['h2','h3','h4','h5','h6'];this.titleElementsStripHTML=true;this.removeTitle=true;this.addLinkId=false;this.linkIdFormat='<tabberid>nav<tabnumberone>';for(arg in argsObj){this[arg]=argsObj[arg];}
this.REclassMain=new RegExp('\\b'+this.classMain+'\\b','gi');this.REclassMainLive=new RegExp('\\b'+this.classMainLive+'\\b','gi');this.REclassTab=new RegExp('\\b'+this.classTab+'\\b','gi');this.REclassTabDefault=new RegExp('\\b'+this.classTabDefault+'\\b','gi');this.REclassTabHide=new RegExp('\\b'+this.classTabHide+'\\b','gi');this.tabs=new Array();if(this.div){this.init(this.div);this.div=null;}}
tabberObj.prototype.init=function(e)
{var
childNodes,i,i2,t,defaultTab=0,DOM_ul,DOM_li,DOM_a,aId,headingElement;if(!document.getElementsByTagName){return false;}
if(e.id){this.id=e.id;}
this.tabs.length=0;childNodes=e.childNodes;for(i=0;i<childNodes.length;i++){if(childNodes[i].className&&childNodes[i].className.match(this.REclassTab)){t=new Object();t.div=childNodes[i];this.tabs[this.tabs.length]=t;if(childNodes[i].className.match(this.REclassTabDefault)){defaultTab=this.tabs.length-1;}}}
DOM_ul=document.createElement("ul");DOM_ul.className=this.classNav;for(i=0;i<this.tabs.length;i++){t=this.tabs[i];t.headingText=t.div.title;if(this.removeTitle){t.div.title='';}
if(!t.headingText){for(i2=0;i2<this.titleElements.length;i2++){headingElement=t.div.getElementsByTagName(this.titleElements[i2])[0];if(headingElement){t.headingText=headingElement.innerHTML;if(this.titleElementsStripHTML){t.headingText.replace(/<br>/gi," ");t.headingText=t.headingText.replace(/<[^>]+>/g,"");}
break;}}}
if(!t.headingText){t.headingText=i+1;}
DOM_li=document.createElement("li");t.li=DOM_li;DOM_a=document.createElement("a");DOM_a.appendChild(document.createTextNode(t.headingText));DOM_li.id="tab"+i;DOM_a.href="javascript:void(null);";DOM_a.title=t.headingText;DOM_a.onclick=this.navClick;DOM_a.tabber=this;DOM_a.tabberIndex=i;if(this.addLinkId&&this.linkIdFormat){aId=this.linkIdFormat;aId=aId.replace(/<tabberid>/gi,this.id);aId=aId.replace(/<tabnumberzero>/gi,i);aId=aId.replace(/<tabnumberone>/gi,i+1);aId=aId.replace(/<tabtitle>/gi,t.headingText.replace(/[^a-zA-Z0-9\-]/gi,''));DOM_a.id=aId;}
DOM_li.appendChild(DOM_a);DOM_ul.appendChild(DOM_li);}
e.insertBefore(DOM_ul,e.firstChild);e.className=e.className.replace(this.REclassMain,this.classMainLive);this.tabShow(defaultTab);if(typeof this.onLoad=='function'){this.onLoad({tabber:this});}
return this;};tabberObj.prototype.navClick=function(event)
{var
rVal,a,self,tabberIndex,onClickArgs;a=this;if(!a.tabber){return false;}
self=a.tabber;tabberIndex=a.tabberIndex;a.blur();if(typeof self.onClick=='function'){onClickArgs={'tabber':self,'index':tabberIndex,'event':event};if(!event){onClickArgs.event=window.event;}
rVal=self.onClick(onClickArgs);if(rVal===false){return false;}}
self.tabShow(tabberIndex);return false;};tabberObj.prototype.tabHideAll=function()
{var i;for(i=0;i<this.tabs.length;i++){this.tabHide(i);}};tabberObj.prototype.tabHide=function(tabberIndex)
{var div;if(!this.tabs[tabberIndex]){return false;}
div=this.tabs[tabberIndex].div;if(!div.className.match(this.REclassTabHide)){div.className+=' '+this.classTabHide;}
this.navClearActive(tabberIndex);return this;};tabberObj.prototype.tabShow=function(tabberIndex)
{var div;if(!this.tabs[tabberIndex]){return false;}
this.tabHideAll();div=this.tabs[tabberIndex].div;div.className=div.className.replace(this.REclassTabHide,'');this.navSetActive(tabberIndex);if(typeof this.onTabDisplay=='function'){this.onTabDisplay({'tabber':this,'index':tabberIndex});}
return this;};tabberObj.prototype.navSetActive=function(tabberIndex)
{this.tabs[tabberIndex].li.className=this.classNavActive;return this;};tabberObj.prototype.navClearActive=function(tabberIndex)
{this.tabs[tabberIndex].li.className='';return this;};function tabberAutomatic(tabberArgs)
{var
tempObj,divs,i;if(!tabberArgs){tabberArgs={};}
tempObj=new tabberObj(tabberArgs);divs=document.getElementsByTagName("div");for(i=0;i<divs.length;i++){if(divs[i].className&&divs[i].className.match(tempObj.REclassMain)){tabberArgs.div=divs[i];divs[i].tabber=new tabberObj(tabberArgs);}}
return this;}
function tabberAutomaticOnLoad(tabberArgs)
{var oldOnLoad;if(!tabberArgs){tabberArgs={};}
oldOnLoad=window.onload;if(typeof window.onload!='function'){window.onload=function(){tabberAutomatic(tabberArgs);};}else{window.onload=function(){oldOnLoad();tabberAutomatic(tabberArgs);};}}
if(typeof tabberOptions=='undefined'){tabberAutomaticOnLoad();}else{if(!tabberOptions['manualStartup']){tabberAutomaticOnLoad(tabberOptions);}}


function sugar_get_widget(callback, title){
	document.write("<div class='widget_external_container'><div id=" + callback + " class='widget_external loading'></div></div>");

	document.observe("dom:loaded", function() {
		new Ajax.Updater(callback, '/get-widget/'+ callback, {
			evalScripts: true,
			onComplete: function(transport) {
				if (200 == transport.status){
					$(callback).removeClassName('loading');
				}
			}
		});
	});
}
function AjaxTabs(container, config) {
    this.container = container;
    var tabs = [];
    var overlay = container + '_overlay';

    function refresh(req) {
        if(req) {
         var containerItem = $(container);
         containerItem.innerHTML = req.responseText;
         if($(overlay)) {
            Element.hide(overlay);
            Element.show(container);
            }
         }
    }
    function setup(config) {
        for(id in config) {
            Event.observe(id, 'click', function(e) {
                var el = e.target || e.srcElement; new Ajax.Request(config[el.id], {
                parameters : "id=" + encodeURIComponent(el.id), method : 'get', asynchronous : true, onSuccess : refresh}
                );
                for(var i = 0; i < tabs.length; i++) {
                    $(tabs[i]).removeClassName('selected');
                }
                el.addClassName('selected');
                if($(overlay)) {
                    Element.hide(container); Element.show(overlay);
                }
                return false;
            });
            tabs.push(id);
        }
    }
    setup(config);
}

var ukInviteShown=false;
function ukInvite() {
	var locale = readCookie('client_locale');
    if(locale != 'GB' || $('ukSugar') == undefined) {
        return;
    }

    var cookie = readCookie('no_uk_msg');
    if(!cookie) {
        ukInviteShown=true;
		new Effect.Appear('ukSugar', 500);
	}

}

function newThemeInvite() {
    var sessionId = readCookie('PHPSESSID');
    if(!ukInviteShown && sessionId && !is('ie 7') && !is('ie 6')) {
        var inviteOK = false;
        //find the first digit in the session.  If it's 0 or 1 give redesign.  this should capture approx 20% of traffic.
        //had to use this convoluted method because IE and FF interpret the sessionId string differently.  Weird.
        for(var i=0; i<sessionId.length; i++) {
            var digit = sessionId.charAt(i);
            if(digit>='0' && digit<='9') {
                if(digit=='0' || digit=='1') {
                    inviteOK=true;
                }
                break;
            }
        }
        if(inviteOK) {
            var cookie = readCookie('no_theme_invite');
            if(!cookie) {
                if(typeof(testTracker)!='undefined') {
                    testTracker._trackEvent('themeInvite', 'show');
                }
                new Effect.Appear('newThemeInvite', 500);
            }
        }
    }
}

function acceptInvite(link) {
    createCookie('no_theme_invite', 1, 365);
    if(typeof(testTracker)!='undefined') {
        testTracker._trackEvent('themeInvite', 'accept');
    }
    setTimeout('document.location = "' + link.href + '"', 100);
    return false;
}

function declineInvite() {
    if(typeof(testTracker)!='undefined') {
        testTracker._trackEvent('themeInvite', 'decline');
    }
    new Effect.Fade('newThemeInvite', 500);
    createCookie('no_theme_invite', 1, 365);
    return false;
}

function spiWatermark() {
    var domain = document.domain.split('.');
    if(domain[0] == 'uk' || domain[0] == 'ukfab' || domain[0] == 'ukpop') {
        return 'popsugar';
    }
    else if(domain[domain.length - 2] == 'onsugar') {
        return domain[0];
    }
    else {
        return domain[1];
    }
}

function followSubmitEmail(formElement) {
    var formValues = Form.serialize(formElement);
    var options = {
        method: 'post',
        contentType: 'application/x-www-form-urlencoded',
        postBody: formValues,
        onSuccess: followHandleResponse
    };
    new Ajax.Request(formElement.action, options);
    return false;
}

var followHandleResponse = function(xmlhttp) {
    var response = xmlhttp != null ? xmlhttp.responseText : null;
    if (response) {

        if (response.indexOf('success') > -1) {
            $('email-msg').innerHTML = '<span class=\"success\">Thanks!</span>';
        }
        else {
            if (response.indexOf('invalid email') > -1) {
                $('email-msg').innerHTML = '<span class="error">Invalid email.</span>';
            }
            else {
                $('sugar-email').innerHTML = '<span class="error">An error occurred.  Please try again later.</span>';
            }
        }
    }
};

function sugarSwitchImages(site1, site2){
    $('logo-home').toggleClassName(site1);
    $('logo-home').toggleClassName(site2);
    $('sugar-girl').toggleClassName(site1);
    $('sugar-girl').toggleClassName(site2);
}

var SugarCarousel = Class.create({
    initialize: function(name, containers, pages, startIndex, doWrap) {
        this.name = name;
		this.containers = containers;
		this.pages = pages;
		this.tagNames = new Array();
		this.currentIndex = startIndex;
		this.timers = new Array(this.containers.length);
		this.opacities = new Array(this.containers.length);
		this.fadeInterval = .04/this.containers.length;
		this.doWrap = doWrap;

		this.useEffects=true;
		if(Prototype.Browser.IE) {
		    this.useEffects=false;
		    var version = navigator.appVersion;
		    var matches = /MSIE (\d)/.exec(version);
		    if(matches && parseInt(matches[1])>=8) {
		        this.useEffects=true;
		    }
		}

		//create the page cache and initialize each entry to null so we know to generate it
		this.pageCache = new Array();
		for(var i=0; i<pages.length; i++) {
		    this.pageCache.push(null);
		}

		//create the three divs that live in each carousel element.  If they already exist, populate the cache with the current innerHTML
		var cur = new Object;
		var prev = new Object;
		var next = new Object;
		var loadPrevAjax=false;
		var loadNextAjax=false;
		for(var i=0; i<this.containers.length; i++) {
		    var baseName = this.name+'-'+this.containers[i];
		    var parent = $(baseName);
		    parent.addClassName('sugar-carousel');
		    this.tagNames.push(parent.tagName);

		    //cache the contents of 'cur', or create it if does not exist
		    var curEl = parent.down('.sugar-carousel-cur');
		    if(!curEl) {
		        //if there isn't a specifically named 'cur' element, create it and fill it with the contents of the div.
		        //TODO: there may be a better way to do this operation.
		        var html = parent.innerHTML;
		        curEl = document.createElement(parent.tagName);
		        curEl.id = baseName+'-'+startIndex;
		        curEl.className = 'sugar-carousel-slide sugar-carousel-cur';
		        curEl.innerHTML = parent.innerHTML;
		        parent.innerHTML='';
		        parent.appendChild(curEl);
		    }
		    cur[baseName] = curEl.innerHTML;

		    //cache the contents of 'prev', or create it if does not exist
		    var prevEl = parent.down('.sugar-carousel-prev');
		    if(!prevEl) {
		        //if there isn't a specifically named 'prev' element, create it
		        prevEl = document.createElement(parent.tagName);
		        prevEl.id = baseName+'-'+this.getLastIndex();
		        prevEl.className = 'sugar-carousel-slide sugar-carousel-prev';
		        parent.insertBefore(prevEl, curEl);
		        loadPrevAjax=true;
		    }
			else {
			    prev[baseName] = prevEl.innerHTML;
			}

			//cache the contents of 'next', or create it if does not exist
			var nextEl = parent.down('.sugar-carousel-next');
			if(!nextEl) {
			    //if there isn't a specifically named 'next' element, create it
			    nextEl = document.createElement(parent.tagName);
			    nextEl.id = baseName+'-'+this.getNextIndex();
			    nextEl.className = 'sugar-carousel-slide sugar-carousel-next';
			    parent.appendChild(nextEl);
			    loadNextAjax=true;
			}
			else {
			    next[baseName] = nextEl.innerHTML;
			}
		}
		//attach handlers to previous and next buttons
		var el = $(this.name+'-pager-next');
		if(el) {
		    el.observe('click', this.slideNext.bind(this));
		}
		var el = $(this.name+'-pager-prev');
		if(el) {
		    el.observe('click', this.slidePrev.bind(this));
		}
		document.observe('keydown', this.slideKey.bind(this));

		this.pageCache[startIndex] = cur;
		if(this.getLastIndex()>=0 && !loadPrevAjax) {
		    this.pageCache[this.getLastIndex()] = prev;
		}
		if(this.getLastIndex()<this.pages.length && !loadNextAjax) {
		    this.pageCache[this.getNextIndex()] = next;
		}

		//if there is a numeric hash on the URL, override the values passed in and load the hash instead.
		if(window.location.hash) {
		    var param = parseInt(window.location.hash.substring(1));
		    if(param>=0 && param<this.pages.length) {
		        this.currentIndex = param;
		    }
		}
		this.loadByIndex(this.currentIndex);
		this.numFlips=0;

		if(typeof(hCarousel)!="undefined") {
            document.observe('carousel:scroll:ended', this.setHash.bind(this));
            document.observe('carousel:scroll:noscroll', this.setHash.bind(this));
        }
		else {
		    document.observe('sugar:fadein:ended', this.setHash.bind(this));
		}
    },
	loadFrame: function(index) {
	    if(!this.pageCache[index]) {
	        if(index>=0 && index<this.pages.length) {
	            this.triggerCachedAjaxReplace(index);
	        }
	    }
	    else {
	        var images = this.pageCache[index]['image-preload'];
	        if(typeof(images)!='undefined') {
	            for(var i=0; i<images.length; i++) {
	                var img = new Image();
	                img.src=images[i];
	            }
	        }
	        for(var i=0; i<this.containers.length; i++) {
	            var baseName = this.name+'-'+this.containers[i];
	            var el = $(baseName+'-'+index);
	            if(el) {
	                el.innerHTML = this.pageCache[index][baseName];
	                if(index==this.currentIndex) {
	                    this.fadeIn(el, i);
	                }
	            }
	        }
	    }
	},
	//random access loading of a frame.  This will load all three frames.
	loadByIndex: function(index) {
	    var selector = $(this.name+'-carousel-selector-'+this.currentIndex);
	    if(selector) {
	        selector.removeClassName('active');
	    }
	    var oldIndex=this.currentIndex;
	    this.currentIndex = index;
	    var selector = $(this.name+'-carousel-selector-'+this.currentIndex);
	    if(selector) {
	        selector.addClassName('active');
	    }

	    var lastIndex = this.getLastIndex();
	    var nextIndex = this.getNextIndex();
	    for(var i=0; i<this.containers.length; i++) {
	        var baseName = this.name+'-'+this.containers[i];
	        var parent = $(baseName);

	        el = parent.down('.sugar-carousel-cur');
	        el.id = baseName+'-'+this.currentIndex;
	        el.innerHTML='';
	        el.addClassName('sugar-carousel-loading');

	        el = parent.down('.sugar-carousel-next');
	        el.id = baseName+'-'+nextIndex;
	        el.innerHTML='';
	        el.addClassName('sugar-carousel-loading');

	        el = parent.down('.sugar-carousel-prev');
	        el.id = baseName+'-'+lastIndex;
	        el.innerHTML='';
	        el.addClassName('sugar-carousel-loading');
	    }
	    if(typeof(hCarousel)!="undefined") {
	        hCarousel.scrollTo(this.currentIndex);
	        this.loadFrame(this.currentIndex);
	    }
	    else {
	        this.loadFrame(this.currentIndex);
            document.fire('sugar:fadein:ended', null);
        }

	    this.loadFrame(nextIndex);
	    this.loadFrame(lastIndex);

	    if(this.name=='gallery' && this.currentIndex!=oldIndex) {
	        this.loadGalleryExtras();
	    }
	},
	slideKey: function(e) {
	    var target;
	    if (!e) {
	        var e = window.event;
	    }
	    if (e.target) {
	        target = e.target;
	    }
	    else if (e.srcElement) {
	        target = e.srcElement;
	    }

	    if(!(target.tagName == 'INPUT' || target.tagName == 'TEXTAREA')) {
	        if(e.keyCode == Event.KEY_LEFT) {
	            this.slide('prev');
	        }
	        else if(e.keyCode == Event.KEY_RIGHT) {
	            this.slide('next');
	        }
	    }
	},
	slideNext: function() {
	    return this.slide('next');
	},
	slidePrev: function() {
	    return this.slide('prev');
	},
	slide: function(direction) {
	    var loadIndex, removeClass, loadClass;
	    var curClass = 'sugar-carousel-cur';
	    var selector = $(this.name+'-carousel-selector-'+this.currentIndex);
	    if(selector) {
	        selector.removeClassName('active');
	    }
	    if(direction=='prev') {
	        this.currentIndex = this.getLastIndex();
	        if(this.currentIndex < 0) {
	            window.location.href = '?';
	        }
	        loadIndex = this.getLastIndex();
	        removeClass = 'sugar-carousel-next';
	        loadClass = 'sugar-carousel-prev';
	    }
	    else {
	        this.currentIndex = this.getNextIndex();
	        if(this.currentIndex >= this.pages.length) {
	            window.location.href = '?more=true';
	        }
	        loadIndex = this.getNextIndex();
	        removeClass = 'sugar-carousel-prev';
	        loadClass = 'sugar-carousel-next';
	    }
	    var selector = $(this.name+'-carousel-selector-'+this.currentIndex);
	    if(selector) {
	        selector.addClassName('active');
	    }

	    for(i=0; i<this.containers.length; i++) {
	        var baseName = this.name+'-'+this.containers[i];
	        var parent = $(baseName);
	        var el = parent.down('.'+removeClass);
	        if(parent && el) {
	            parent.removeChild(el);
	        }
	        el = parent.down('.'+curClass);
	        el.removeClassName(curClass);
	        el.addClassName(removeClass);

	        var curEl = parent.down('.'+loadClass);
            this.fadeIn(curEl, i);
	        curEl.removeClassName(loadClass);
	        curEl.addClassName(curClass);

	        el = $(document.createElement(this.tagNames[i]));
	        el.id = baseName+'-'+loadIndex;
	        el.className = 'sugar-carousel-slide sugar-carousel-loading '+loadClass;
	        parent.appendChild(el);
	    }

	    if(typeof(hCarousel)!="undefined") {
	        hCarousel.scrollTo(this.currentIndex);
	    }
	    else {
	        document.fire('sugar:fadein:ended', null);
	    }

	    this.loadFrame(loadIndex);

	    if(this.name=='gallery') {
	        this.loadGalleryExtras();
	    }
	},
	triggerCachedAjaxReplace: function(index) {
	    var responseFunction = function(response) {
	        this.pageCache[index] = eval("("+response.responseText+")");
	        this.loadFrame(index);
	    };
	    new Ajax.Request(this.pages[index], {
	        onSuccess: responseFunction.bind(this)
	    });
	},
	getLastIndex: function() {
	    var ret = this.currentIndex-1;
	    if(this.doWrap && ret==-1) {
	        ret = this.pages.length-1;
	    }
	    return ret;
	},
	getNextIndex: function() {
	    ret = this.currentIndex+1;
	    if(this.doWrap && ret==this.pages.length) {
	        ret = 0;
	    }
	    return ret;
	},
	loadGalleryExtras: function() {
	    this.numFlips++;
	    // refresh ads
        if(this.numFlips%1==0) {
            //I'm doing this the same way we do it elsewhere.  I assume there's a reason.
            var rand = Math.floor(Math.random()*99999999999);
            var ad = $('iframe-rect1');
            if(ad) {
                ad.src=ad.src.replace(/ord=\d+/, 'ord='+rand);
            }
            ad = $('iframe-leader1');
            if(ad) {
                ad.src=ad.src.replace(/ord=\d+/, 'ord='+rand);
            }
            ad = $('iframe-rect2');
            if(ad) {
                ad.src=ad.src.replace(/ord=\d+/, 'ord='+rand);
            }
            ad = $('iframe-sky0');
            if(ad) {
                ad.src=ad.src.replace(/ord=\d+/, 'ord='+rand);
            }
        }
        var url = window.location.pathname+window.location.search;
        url = url.replace(/page\=0,0,\d+/, 'page=0,0,'+this.currentIndex);
        url = url.replace('#'+this.currentIndex,'');
        ajaxLoadAnalytics(url);
	},
	fadeIn: function(el, i) {
	    if(!this.useEffects) {
	        return;
	    }
	    if(typeof(this.timers[i])=='PeriodicalExecuter') {
            this.timers[i].stop();
        }
        el.setOpacity(0);
        this.opacities[i] = 0;
        if(typeof(this.timers[i])!='undefined') {
            this.timers[i].stop();
        }
        this.timers[i] = new PeriodicalExecuter(function(el, idx) {
            el.setOpacity(this.opacities[idx]);
            if(this.opacities[idx]>=1) {
                this.timers[idx].stop();
            }
            this.opacities[idx]+=.2;
        }.bind(this, el, i), this.fadeInterval);
	},
	setHash: function() {
	    window.location.hash=this.currentIndex;
	}
});

var ooyalaAutostartState = new Array();
var ooyalaAdInterval = new Array();
var ooyalaAdOverlayStarted = new Array();
var ooyalaShowAd = new Array();

function receiveSVPEvent(playerId, eventName, p) {
    // player_7090905
    nid = playerId.split('_')[1];

    //console.log(eventName);
    //console.log(p);


    switch(eventName) {
        case 'apiReady':
            if(ooyalaAutostartState[playerId]) {
                $(playerId).playMovie();
            }
            break;
        case 'stateChanged' :
            switch(p.state) {
                case 'playing':
                    if(!ooyalaAdOverlayStarted[nid] && ooyalaShowAd[nid]) {
                        $('video_' + nid).getElementsBySelector('.svp-ad-overlay')[0].style.display = 'block';
                        $('video_' + nid).getElementsBySelector('.svp-ad-clickthrough')[0].style.background = 'url(' + ooyalaShowAd[nid] +')';
                        adInner = $('video_' + nid).getElementsBySelector('.svp-ad-inner')[0];
                        if(adInner) {
                            ooyalaAdInterval[nid] = window.setInterval("slideAd(adInner, nid)",1);
                            ooyalaAdOverlayStarted[nid] = true;
                        }
                    }
                    break;
            }
            break;
        case 'playheadTimeChanged':
            var playheadTime = p.playheadTime;
            // assumes that there is only one annotated video per page.
            // safe assumption...for now.
            var sections = document.SVPVars.sections;
            var sectionId;

            if(sections){
                for(var i in sections){
                    if (playheadTime >= (sections[i].time - 1)) {
                        sectionId = i;
                    }
                }

                if (sectionId > -1 && document.SVPVars.activeSectionId != sectionId){
                    document.SVPVars.activeSectionId = sectionId;

                    //explicitly do each on, faster than invoke() on class;
                    var k = 0;
                    while(k < sections.length){
                        $('svp-section-' + k).removeClassName('active');
                        k++;
                    }

                    $('svp-section-' + sectionId).addClassName('active');
                }
            }
            break;
    }
}


//triggers a new page load for a url in each of our 7,538,292,938 analytics services
function ajaxLoadAnalytics(url) {
    //Google Analytics
    if(typeof(sugarIncTracker)!='undefined') {
        sugarIncTracker._trackPageview(url);
    }
    if(typeof(sugarNetworkTracker)!='undefined') {
        sugarNetworkTracker._trackPageview(url);
    }
    if(typeof(testTracker)!='undefined') {
        testTracker._trackPageview(url);
    }

    var abTracker = _gaq || [];
    abTracker.push(['_setAccount', 'UA-5550157-2']);
    abTracker.push(['_setDomainName', 'none']);
    abTracker.push(['_setAllowLinker', true]);
    abTracker.push(['_trackPageview', url]);

    //Quantcast
    if(typeof(_qcdc)!='undefined') {
        //this registers the current URL, which isn't necessarily the same as the URL param of this function.  QC doesn't support doing a pageview beacon with an arbitrary URL
        quantserve();
    }

    //Comscore
    if(typeof(COMSCORE)!='undefined') {
        COMSCORE.beacon({
            c1:2,
            c2:6035900,
            c3:"",
            c4:url,
            c5:"",
            c6:"",
            c15:comscoreHash
      });
    }

    //Statcounter
    //method taken from http://forum.statcounter.com/vb/archive/index.php/t-25668.html
    if(typeof(sc_tracking_url)!='undefined') {
        var oldUrl = sc_tracking_url;
        var parts = oldUrl.split('?');
        var base=parts[0];
        var query='';
        //reassemble the query string, assuming that there may be unescaped '?' characters in it.
        for(var i=1; i<parts.length; i++) {
            if(i>1) {
                query+='?';
            }
            query+=parts[i];
        }
        var queryParts = query.split('&');
        var newQuery = '';
        for(var i=0; i<queryParts.length; i++) {
            var marker = queryParts[i].indexOf('=');
            var name = queryParts[i].substring(0,marker);
            if(name!='camefrom') {
                if(i!=0) {
                    newQuery+='&';
                }
                if(name=='u') {
                    //note that this doesn't "fix" the url for the referer, so you can see "http://...?page=0,0,0#12.  Does this matter?
                    newQuery+=queryParts[i].replace('u=','camefrom=');
                    newQuery+='&u='+encodeURIComponent(window.location.protocol+'//'+window.location.host+url);
                }
                else {
                    newQuery+=queryParts[i];
                }
            }
        }
        img = new Image(0,0);
        img.src = base+'?'+newQuery;
    }

    //ck.php (internal counter)
    if(typeof(trackingHost)!='undefined' && typeof(trackingPrefix)!='undefined' && typeof(galleryNid)!='undefined') {
        img = new Image(0,0);
        img.src = trackingHost + "/static/ck.php?nids[]=" + galleryNid + "&p=" + trackingPrefix;
    }

    //Nielsen (for AU)
    //Do this when we turn on galleries for AU
}
function slideAd(el, index) {
    el = $(el);
    var curLeft = el.positionedOffset().left;
    if(curLeft < 0) {
        var newLeft = curLeft + 10;
        newLeft = newLeft < 0 ? newLeft : 0;
        el.style.left = newLeft + 'px';
    }
    else {
        clearInterval(ooyalaAdInterval[index]);
    }
}

/* Client-side access to querystring name=value pairs
	Version 1.3
	28 May 2008

	License (Simplified BSD):
	http://adamv.com/dev/javascript/qslicense.txt
*/
function Querystring(qs) { // optionally pass a querystring to parse
	this.params = {};

	if (qs == null) qs = location.search.substring(1, location.search.length);
	if (qs.length == 0) return;

// Turn <plus> back to <space>
// See: http://www.w3.org/TR/REC-html40/interact/forms.html#h-17.13.4.1
	qs = qs.replace(/\+/g, ' ');
	var args = qs.split('&'); // parse out name/value pairs separated via &

// split out each name=value pair
	for (var i = 0; i < args.length; i++) {
		var pair = args[i].split('=');
		var name = decodeURIComponent(pair[0]);

		var value = (pair.length==2)
			? decodeURIComponent(pair[1])
			: name;

		this.params[name] = value;
	}
}

Querystring.prototype.get = function(key, default_) {
	var value = this.params[key];
	return (value != null) ? value : default_;
}

Querystring.prototype.contains = function(key) {
	var value = this.params[key];
	return (value != null);
}

function fetchFgAdvertorial() {
    var url = false;
    var client_locale = readCookie('client_locale');

    if (client_locale == 'US') {
	    if (typeof(nidOverride)!='undefined') {
	        url = '/fg_advertorial_ajax_nid/'+nidOverride;
	    }
	    else {
	        var fg_nid = readCookie('fg_locale');
	        if(!fg_nid) {
	            //do default thing here
	            fg_nid=0;
	        }
	        url = '/fg_advertorial_ajax_gid/'+fg_nid+'?fastcache=1';
	    }
    }

    if(url) {
        new Ajax.Updater('fg-adv-container', url, {});
    }
}

function fetchGeoAdvertorial() {
    var url = false;
    var client_locale = readCookie('client_locale');

    if (client_locale != null && client_locale != 'US') {
    	url = '/sugar-ads/geo_advertorial_ajax/' + client_locale + '?fastcache=1';
    }

    if(url) {
        new Ajax.Updater('geo-adv-container', url, {});
    }
}

function submitGeoEmail(form, messageField, refererExtra, redirect, useShortError) {
    new Ajax.Request('/email_api', {
        parameters: {
            email: form.email.value,
            zip: form.zip.value,
            send_to_fg : 1,
            referer_extra : refererExtra
        },
        evalJSON: 'force',
        onSuccess: function(response) {
            var responseObj;
            var errorMsg = null;
            var locale = response.responseJSON.locale;

            if(!locale) {
                if(responseObj = response.responseJSON.error) {
                    if(responseObj['invalid_email'] || responseObj['invalid_zip']) {
                        errorMsg = useShortError ? "Invalid email or ZIP.  Please try again." : "Oops!  It looks like you've entered an invalid email or ZIP.  Please try again.";
                    }
                    //no need to show an error for a duplicate entry.  just do success again.
                    else if(!responseObj['duplicate_email_zip']) {
                        errorMsg = useShortError ? "Invalid email or ZIP.  Please try again." : "Oops!  A network error occurred.  Please try again.";
                    }
                }
                else {
                    //What to do here?
                    errorMsg = useShortError ? "Invalid email or ZIP.  Please try again." : "Oops!  We couldn't find that ZIP code.  Please try again.";
                }
            }

            if(errorMsg) {
                $(messageField).innerHTML = errorMsg;
                $(messageField).removeClassName("success");
                $(messageField).addClassName("error");
            }
            else {
                form.email.value='';
                form.zip.value='';
                if(redirect) {
                    window.location.href = redirect;
                }
                else {
                    $(messageField).innerHTML = "You're signed up!  Thanks!";
                    $(messageField).removeClassName("error");
                    $(messageField).addClassName("success");
                }
            }
        }
      });
}

/* BEGIN: Required functions for Doubleclick PushDownAds */
function pushDownOpen(divId, animDuration, expandedHeight, collapsedHeight) {
    if ($(divId) != null) {
        setTimeout(function(){
            new Effect.Tween(divId, collapsedHeight, expandedHeight, {duration: animDuration, transition: Effect.Transitions.linear}, function(p){$(divId).style.height= p + "px"});
        });
    }
}

function pushDownClose(divId, animDuration, expandedHeight, collapsedHeight) {
    if ($(divId) != null) {
        setTimeout(function(){
            new Effect.Tween(divId, expandedHeight, collapsedHeight, {duration: animDuration, transition: Effect.Transitions.linear}, function(p){$(divId).style.height= p + "px"});
        });
    }
}

function setDivHeight(divId, expandedHeight) {
    if ($(divId) != null) {
        $(divId).style.height = expandedHeight + 'px';
    }
}

/* END: Required functions for Doubleclick PushDownAds */

/* BEGIN Lazy loading of share widgets */

function loadShareWidgets() {
    if(!$('sugar-content-container')){
        return
    }
    var share_divs = $('sugar-content-container').select('.post-share-panel');
    var nids = share_divs.collect(
            function (e) {
                return e.id.split('_')[2];
            }
    );
    if (nids.length > 0) {
        new Ajax.Request(
                '/load_share_widgets',
                {
                    parameters: 'nids=' + nids.toJSON(),
                    requestHeaders: {Accept: 'application/json'},
    		method: 'get',
                    onSuccess: function(transport) {
                        var share_widgets = transport.responseText.evalJSON(true);
                        Object.keys(share_widgets['results']).each(
                                function (key) {
                                    $("share_panel_" + key).update(share_widgets['results'][key]);
                                }
                        );

                    }
                }

        );
    }
}
document.observe('dom:loaded', loadShareWidgets);
/* END Lazy loading of share widgets */

function anchorPopupWindow(anchor, params, handle) {
    var u=anchor.href;
    if (params == null) {
        params='toolbar=0,status=0,width=626,height=436';
    }
    if (handle == null) {
        handle='popup' + Math.floor(Math.random()*11);
    }
    window.open(u, handle, params);
    return false;
}

