// Program: insite_cookie_manager.jsa
// Purpose: This program should be used to extract user information from either the default '<SITENAME>_user_auth' cookie, 
//   or the more detailed 'insite_account_info' cookie.  
//   NOTE: The 'insite_account_info' cookie is not used by Insite by default, and must be added to the list of custom cookies. See wiki for details.
// Expected Use:
//   When a user instantiates this object several variables will be set and available to the user these are, also users can call the methods outlined here if they need to for some reason.  NOTE: All variables after 'userLoggedIn' are only set if the user is acually logged into Insite.
//     userLoggedIn = 1 if logged in, 0 if not
//     userID       = Users Insite ID
//     userName     = Users Insite username
//     firstName    = Users first name as Insite sees it
//     lastName     = Users last name as Insite sees it
//     email        = Users Email as registered with Insite
// Author:  Ara Yapejian - 3/31/2008

function Insite_Cookie_Manager() {
	// The name of the default Insite Cookie as well as the more detailed 'insite_account_info' cookie
	this.insiteDefaultCookie = 'user_auth';
	this.insiteAccountInfoCookie = 'insite_account_info';
	
	// Purpose: This function will return 1 if the user is logged into insite, and 0 if not.
	this.isUserLoggedIn = function() {
		if( document.cookie.length > 0 ) {
			var cookieValue = document.cookie.match( '(^|;)*' + this.insiteDefaultCookie + '=([^;]*)(;|$)' );
			if( cookieValue && !document.cookie.match( '(^|;)*' + this.insiteDefaultCookie + '=\.threshold([^;]*)(;|$)' ) )
				return( "1" );
			else 
				return( "0" );
		}
	}
	
	// Purpose: This function will return the Insite users 'username' from the default, and always available (When logged in) 'user_auth' cookie.
	this.getInsiteUserName = function() {
		if( document.cookie.length > 0 ) {
			var cookieValue = document.cookie.match( '(^|;)*' + this.insiteDefaultCookie + '=([^;]*)(;|$)' );
			if( cookieValue && !document.cookie.match( '(^|;)*' + this.insiteDefaultCookie + '=\.threshold([^;]*)(;|$)' ) ){
				var end = cookieValue[2].indexOf( "%7C" );
				var userName = cookieValue[2].substr(0, end);
				return( userName );
			} else
				return( "0" );
		} else
			return( "0" );
	}
	
	// Purpose: This function will return the users insite ID from the 'insite_account_info' cookie
	this.getInsiteID = function() {
		if( document.cookie.length > 0 ) {
				var cookieValue = document.cookie.match( '(^|;)*' + this.insiteAccountInfoCookie + '=([^;]*)(;|$)' );
			        if( cookieValue && !document.cookie.match( '(^|;)*' + this.insiteDefaultCookie + '=\.threshold([^;]*)(;|$)' ) ){
					// Get the index of the first and last character in the cookie argument we need
					var start = cookieValue[2].indexOf( "id%3D" );
					var end   = cookieValue[2].indexOf( "%7C", start );
					// Extract that one piece of the cookie based on the start, end values.  The calculate a new 'start' for the '=' to get the 
					//   actual value of the piece we are interested ... increment by 3 based on teh '%3D' Hex code for '='
					// The little 'end == -1' part is needed if the value found is the last value in the cookie ... if it is then the
					//   'end' index (where we look for the next occurence of a pipe ("%7C") wont exist and brakes stuff.
					if( end == -1 )
						var extractedCookieValue = cookieValue[2].substr( start );
					else
						var extractedCookieValue = cookieValue[2].substring( start,end );
					start = extractedCookieValue.indexOf( "%3D" );
					start = start + 3;
					var ID = extractedCookieValue.substr(start);
					return( ID );
				} else
					return( "0" );
			} else
				return( "0" );
	}
	
	// Purpose: This function will return the users first name from the 'insite_account_info' cookie
	this.getInsiteFirstName = function() {
		if( document.cookie.length > 0 ) {
			var cookieValue = document.cookie.match( '(^|;)*' + this.insiteAccountInfoCookie + '=([^;]*)(;|$)' );
			if( cookieValue && !document.cookie.match( '(^|;)*' + this.insiteDefaultCookie + '=\.threshold([^;]*)(;|$)' ) ){
				// Get the index of the first and last character in the cookie argument we need
				var start = cookieValue[2].indexOf( "first_name%3D" );
				var end   = cookieValue[2].indexOf( "%7C", start );
				// Extract that one piece of the cookie based on the start, end values.  The calculate a new 'start' for the '=' to get the 
				//   actual value of the piece we are interested ... increment by 3 based on teh '%3D' Hex code for '='
				// The little 'end == -1' part is needed if the value found is the last value in the cookie ... if it is then the
				//   'end' index (where we look for the next occurence of a pipe ("%7C") wont exist and brakes stuff.
				if( end == -1 )
					var extractedCookieValue = cookieValue[2].substr( start );
				else
					var extractedCookieValue = cookieValue[2].substring( start,end );
				start = extractedCookieValue.indexOf( "%3D" );
				start = start + 3;
				var firstName = extractedCookieValue.substr(start);
	
				return( firstName );
			} else
				return( "0" );
		} else
			return( "0" );
	}
	
	// Purpose: This function will return the users last name from the 'insite_account_info' cookie
	this.getInsiteLastName = function() {
	if( document.cookie.length > 0 ) {
			var cookieValue = document.cookie.match( '(^|;)*' + this.insiteAccountInfoCookie + '=([^;]*)(;|$)' );
			if( cookieValue && !document.cookie.match( '(^|;)*' + this.insiteDefaultCookie + '=\.threshold([^;]*)(;|$)' ) ){
				// Get the index of the first and last character in the cookie argument we need
				var start = cookieValue[2].indexOf( "last_name%3D" );
				var end   = cookieValue[2].indexOf( "%7C", start );
				// Extract that one piece of the cookie based on the start, end values.  The calculate a new 'start' for the '=' to get the 
				//   actual value of the piece we are interested ... increment by 3 based on teh '%3D' Hex code for '='
				// The little 'end == -1' part is needed if the value found is the last value in the cookie ... if it is then the 
				//   'end' index (where we look for the next occurence of a pipe ("%7C") wont exist and brakes stuff.
				if( end == -1 )
					var extractedCookieValue = cookieValue[2].substr( start );
				else                    
					var extractedCookieValue = cookieValue[2].substring( start,end );
				start = extractedCookieValue.indexOf( "%3D" );
				start = start + 3;
				var lastName = extractedCookieValue.substr(start);
	
				return( lastName );
			} else
				return( "0" );
		} else
			return( "0" );
	}
	
	// Purpose: This function will return the users email from the 'insite_account_info' cookie
	this.getInsiteEmail = function() {
		if( document.cookie.length > 0 ) {
			var cookieValue = document.cookie.match( '(^|;)*' + this.insiteAccountInfoCookie + '=([^;]*)(;|$)' );
			if( cookieValue && !document.cookie.match( '(^|;)*' + this.insiteDefaultCookie + '=\.threshold([^;]*)(;|$)' ) ){
				// Get the index of the first and last character in the cookie argument we need
				var start = cookieValue[2].indexOf( "email%3D" );
				var end   = cookieValue[2].indexOf( "%7C", start );
				// Extract that one piece of the cookie based on the start, end values.  The calculate a new 'start' for the '=' to get the 
				//   actual value of the piece we are interested ... increment by 3 based on teh '%3D' Hex code for '='
				// The little 'end == -1' part is needed if the value found is the last value in the cookie ... if it is then the 
				//   'end' index (where we look for the next occurence of a pipe ("%7C") wont exist and brakes stuff.
				if( end == -1 ) 
					var extractedCookieValue = cookieValue[2].substr( start );
				else 
					var extractedCookieValue = cookieValue[2].substring( start,end );
				start = extractedCookieValue.indexOf( "%3D" );
				start = start + 3;
				var email = extractedCookieValue.substr(start);
	
				return( email );
			} else
				return( "0" );
		} else
			return( "0" );
	}
	

// ***********************************
// THE MAIN CONSTRUCTOR FOR THE CLASS
// ***********************************
	this.userLoggedIn = this.isUserLoggedIn();
	// If the user is logged in get all info
	if( this.userLoggedIn != 0 ) {
		this.userID       = this.getInsiteID();
		this.userName     = this.getInsiteUserName();
		this.firstName    = this.getInsiteFirstName();
		this.lastName     = this.getInsiteLastName();
		this.email        = this.getInsiteEmail();
	} else {
		this.userID       = "";
		this.userName     = "";
		this.firstName    = "";
		this.lastName     = "";
		this.email        = "";
        }
	
} // END OF PROGRAM


// ##################
// PURPOSE: This function fetches our insite cookie and returns the insite userName or "-1" if not logged in
function getInsiteUserName( myInsiteCookieName ) {
        if( document.cookie.length > 0 ) {
                var cookieValue = document.cookie.match( '(^|;)*' + myInsiteCookieName + '=([^;]*)(;|$)' );
	        if( cookieValue && !document.cookie.match( '(^|;)*' + this.insiteDefaultCookie + '=\.threshold([^;]*)(;|$)' ) ){
                        var end = cookieValue[2].indexOf( "%7C" );
                        var userName = cookieValue[2].substr(0, end);
                        if( userName == '' ){
                                return( "-1" );
                        }
                        return( userName );
                } else
                        return( "-1" );
        } else
                return( "-1" );
}
// ##################
//SHOW HIDE CSS

//if (typeof account_user_name != 'undefined' && typeof insitecookie != 'undefined') {
	var account_user_name = getInsiteUserName( insitecookie );
	if ( -1  == account_user_name) {
		document.write("<style>#member{display:none;}</style>");
		account_user_name = 'Guest';
	} else {
		document.write("<style>#nonmember{display:none;}</style>");
	}
//}

var rurl_qs = '';
var loc = ''+document.location;
if (loc.match('/reg-bin/') )
{
    rurl_qs = ";goto=/";
}
else
{
    rurl_qs = ";goto="+loc
}



// temporary switch stand in for Pluck
var siteLife_master_switch_on = true;
var sitelife_is_on = true;

if (!siteLife_master_switch_on || !sitelife_is_on) {
	var gSiteLife = {
		AddEventHandler: function () {},
		FireEvent: function () {},
		ScriptId: function() {},
		OnError: function() {},
		OnDebug: function() {},
		GetParameter: function() {},
		GetElement: function() {},
		GetTags: function() {},
		EscapeValue: function() {},
		__ArrayValidation: function() {},
		__CheckErrorHandler: function() {},
		SetCookie: function SetCookie() {},
		__GetArgument: function() {},
		__StripAnchorFromUrl: function() {},
		__SafeAppendUrlValue: function() {},
		__AppendUrlValues: function () {},
		ReloadPage: function() {},
		__Send: function() {},
		Logout: function() {},
		AddLoadEvent: function() {},
		AdInsertHelper: function() {},
		InsertAds: function() {},
		TitleTag: function() {},
		WriteDiv: function() {},
		InnerHtmlWrite: function() {},
		SortTimeStampDescending: "TimeStampDescending",
		SortTimeStampAscending: "TimeStampAscending",
		SortRecommendationsDescending: "RecommendationsDescending",
		SortRecommendationsAscending: "RecommendationsAscending",
		SortRatingDescending: "RatingDescending",
		SortRatingAscending: "RatingAscending",
		SortAlphabeticalAscending: "AlphabeticalAscending",
		SortAlphabeticalDescending: "AlphabeticalDescending",
		KeyTypeExternalResource: "ExternalResource",
		PersonaHeaderRequest: function() {},
		PersonaHeader: function() {},
		Persona: function() {},
		LoadPersonaPage: function() {},
		PersonaHome: function() {},
		PopulateGroupsDiv: function() {},
		WatchItem: function() {},
		PersonaRemoveWatchItem: function() {},
		PersonaAddFriend: function() {},
		PersonaRemoveFriend: function() {},
		PersonaRemovePendingFriend: function() {},
		PersonaAddPendingFriend: function() {},
		PersonaMessages: function() {},
		PersonaComments: function() {},
		PersonaBlog: function() {},
		PersonaProfile: function() {},
		PersonaWatchListPaginate: function() {},
		PersonaFriendsPaginate: function() {},
		PersonaFriendsExpand: function() {},
		PersonaFriendsCollapse: function() {},
		PersonaPendingFriendsPaginate: function() {},
		PersonaMessagesPreviewPaginate: function() {},
		PersonaMessageRemove: function() {},
		PersonaSend: function() {},
		PersonaPaginate: function() {},
		PersonaPhotoSend: function() {},
		PersonaMostRecent: function() {},
		PersonaCommunityGroupsPaginate: function() {},
		PersonaCreateGallery: function() {},
		PersonaEditGallery: function() {},
		PersonaUploadToUserGallery: function() {},
		PersonaPhotos: function() {},
		PersonaAllPhotos: function() {},
		PersonaGalleryPhoto: function() {},
		PersonaMyRecentPhotos: function() {},
		PersonaGallery: function() {},
		UserGalleryList: function() {},
		PersonaGallerySubmissions: function() {},
		PersonaGalleryPhoto: function() {},
		PersonaRecentGalleryPhoto: function() {},
		LoadPersonaGalleryPage: function() {},
		LoadPersonaPhotoPage: function() {},
		LoadPersonaRecentPhotoPage: function() {},
		ShowFacebookHelpDialog: function() {},
		CopyRssUrlToClipboard: function() {},
		SolicitPhoto: function() {},
		PhotoUpload: function() {},
		PublicGallery: function() {},
		GalleryPhoto: function() {},
		PublicGalleries: function() {},
		PhotoRecommend: function() {},
		Comments: function() {},
		CommentsInput: function() {},
		CommentsOutput: function() {},
		CommentsRefresh: function() {},
		CommentsInternal: function() {},
		GetComments: function() {},
		Blog: function() {},
		LoadBlogPage: function() {},
		BlogViewEdit: function() {},
		BlogPostCreate: function() {},
		BlogPendingComments: function() {},
		BlogSettings: function() {},
		BlogEditPost: function() {},
		BlogRemovePost: function() {},
		BlogViewPost: function() {},
		BlogViewMonth: function() {},
		AddBlogWatchItem: function() {},
		RemoveBlogWatchItem: function() {},
		BlogViewTag: function() {},
		BlogRefreshViewEditList: function() {},
		BlogSend: function() {},
		Recommend: function() {},
		BlogSelectPendingComments: function() {},
		Forums: function() {},
		ForumCategories: function() {},
		Forum: function() {},
		ForumDiscussion: function() {},
		ForumCreateDiscussion: function() {},
		ForumMain: function() {},
		ForumCreatePost: function() {},
		ForumEditPost: function() {},
		ForumEditProfile: function() {},
		ToggleExpand: function() {},
		ForumSearch: function() {},
		ForumSearchKeyPress: function() {},
		ForumSearchPaginate: function() {},
		ForumSpecificForumSearchKeyPress: function() {},
		ForumSpecificForumSearch: function() {},
		ForumSearchSpecificForumPaginate: function() {},
		LoadForumPage: function() {},
		ForumSend: function() {},
		ForumDiscussionEdit: function() {},
		ForumDiscussionToggleIsSticky: function() {},
		ForumDiscussionToggleIsClosed: function() {},
		ForumDiscussionDelete: function() {},
		MoveDiscussion: function() {},
		ForumEdit: function() {},
		ForumToggleIsClosed: function() {},
		ForumDelete: function() {},
		ForumPostDelete: function() {},
		ForumBlockUser: function() {},
		ForumMyDiscussionsPaginate: function() {},
		ForumImage: function() {},
		BaseAdParam: function () {},
		ForumJoinGroup: function() {},
		ForumLeaveGroup: function() {},
		ForumGroupMemberList: function() {},
		ForumInviteUser: function() {},
		ForumGroupConfirm: function() {},
		ForumSendInviteToUser: function() {},
		ForumAddEnemy: function() {},
		ForumRemoveEnemy: function() {},
		ForumChangeSort: function() {},
		Recommend: function() {},
		PostRecommendation: function() {},
		RateItem: function () {},
		Rating: function() {},
		RatingClickStar: function () {},
		RatingFillStar: function() {},
		Review: function() {},
		ReviewClickStar: function () {},
		GetReviews: function() {},
		SummaryArticlesMostCommented: function() {},
		SummaryArticlesMostRecommended: function() {},
		SummaryPhotosRecentPhotosByTag: function() {},
		SummaryPhotosRecentUserPhotos: function() {},
		SummaryPhotosRecentPhotos: function() {},
		SummaryPhotosMostRecommendedPhotos: function() {},
		SummaryPhotosMostRecommendedUserPhotos: function() {},
		SummaryPhotosMostRecommendedGalleries: function() {},
		SummaryForumsRecentDiscussions: function() {},
		SummaryBlogsRecent: function() {},
		SummaryBlogsRecentPostsByTag: function() {},
		SummaryBlogsRecentPosts: function() {},
		SummaryBlogsMostRecommendedPosts: function() {},
		SummaryPersonaProfileRecent: function() {},
		SummaryPanel: function() {},
		SummarySend: function() {}
	}
	var RequestBatch = function() {};
	RequestBatch.prototype = {
		initialize: function() {},
		AddToRequest: function(requestThis) { },
		BeginRequest: function(serverUrl, callback) {}
	};
	function Section () {}
	function Category () {}
	function Activity () {}
	function ContentType () {}
	function UserTier () {}
	function DiscoverContentAction () {}
	function UserKey () {}
	function ArticleKey () {}
	function UpdateArticleAction () {}
	function CommentPage () {}
}
if(typeof siteLife_master_switch_on==='undefined'){var siteLife_master_switch_on=true;}
if(typeof sitelife_is_on==='undefined'){var sitelife_is_on=true;}var sitelife_is_on=true;var pluck_env=(location.host.match(/^(preview|dev)/))?'pluckdev':'pluck';pluck_env+='.ledger-enquirer.com';var serverUrl='http://'+pluck_env+'/ver1.0/Direct/Process';    //multi site enabled -- sid: pluck.ledger-enquirer.com 

///<summary>constructor to create a new SiteLifeProxy</summary>
function SiteLifeProxy(url) {
    // User Configurable Properties - these can be set at any time

    // your apiKey, this value must be set!
    this.apiKey = null;

    // sniff the browser for custom behaviors
    this.__isExplorer = navigator.userAgent.toLowerCase().indexOf('msie') != -1;
    this.__isSafari = navigator.userAgent.toLowerCase().indexOf('safari') != -1;
    this.__isMac = navigator.platform.toLowerCase().indexOf('mac') != -1;
    this.__isMacIE = this.__isMac && this.__isExplorer;
    
    // if enabled, spit out debug information through alert()
    this.debug = false;
    
    // used to track the id of the handler expecting the results from the immediately preceeding method invocation
    // this is used only for testing purposes
    this.lastHandlerId = "";
    
    // Methods You can Overide
    //
    // OnSuccess(returnValue) - is passed the return value at the end of a successful call, default does nothing
    // OnError(msg) - is passed an error message if a problem occurs
    // OnDebug(msg) - is called when debugging is enabled
     
    this.__baseUrl = url;
    this.__sendInvokeCount = 0;
    
    this.__eventHandlers = new Object();
};

SiteLifeProxy.prototype.AddEventHandler = function (event_name, callback) {
	var eventList = this.__eventHandlers[event_name];
	if (!eventList){
		eventList = new Array();
		this.__eventHandlers[event_name] = eventList;
	}
	eventList.push(callback);
};

SiteLifeProxy.prototype.FireEvent = function (event_name) {
    var func;
    if(handlers = this.__eventHandlers[event_name]) {
        var A = new Array(); for (var i = 1; i <  this.FireEvent.arguments.length; i++){ A[i - 1] = this.FireEvent.arguments[i];}
        for(var x=0;x<handlers.length;x++){
			func = handlers[x];
			if (func.__Bound){
			   if (handlers.length == 1) return func();
			   func();
			}
			if (handlers.length == 1) return func.apply(this, A);
			func.apply(this, A);
    }
}
};

SiteLifeProxy.prototype.ScriptId = function() { return this.__scriptId = "_bb_script_" + this.__sendInvokeCount++; }

// Default error handler for the proxy object, simple alert
SiteLifeProxy.prototype.OnError = function(msg) {
   alert("OnError: " + msg);
}

// Default debug handler for the proxy object, simple alert
SiteLifeProxy.prototype.OnDebug = function(msg) {
    if (this.debug)
        alert("Debug: " + msg);
}

// fetch a named request parameter from the page URL
SiteLifeProxy.prototype.GetParameter = function(parameterName) {
    var key = parameterName + "=";
    var parameters = document.location.search.substring(1).split("&");
    for (var i = 0; i < parameters.length; i++)
    {
        if (parameters[i].indexOf(key) == 0)
            return parameters[i].substring(key.length);
    }
    return null;
};

// browser independent method to get elements by ID
SiteLifeProxy.prototype.GetElement = function(id) {
    this.OnDebug("GetElement " + id);
    if (document.getElementById)
        return document.getElementById(id);
    if (document.all)
        return document.all[id];
    this.OnError("No support for GetElement() in this browser");
    return null;
}

// browser independent method to get elements by tag name
SiteLifeProxy.prototype.GetTags = function(tagName) {
    this.OnDebug("GetTags " + tagName);
    if (document.getElementsByTagName)
        return document.getElementsByTagName(tagName);
    if (document.all)
       return document.tags(tagName);
    this.OnError("No support for GetTags() in this browser");
    return null;
}

SiteLifeProxy.prototype.Trim = function(s) {
	return s.replace(/^\s+|\s+$/g,"");

};

SiteLifeProxy.prototype.EscapeValue = function(s) {
    if (s == null) return null;
    return encodeURIComponent(s);
};

SiteLifeProxy.prototype.__ArrayValidation = function(s)
{
    if ((typeof s == 'undefined') || (s.length < 1))
    {
        return false;
    }
    return true;
}

SiteLifeProxy.prototype.__CheckErrorHandler = function(onError) {
    this.OnDebug("__CheckErrorHandler " + onError);
    if ((typeof onError == 'undefined') || (eval("window." + onError) == null))
    {
      return "gSiteLife.OnError";
    }
    return onError;
}
SiteLifeProxy.prototype.SetCookie = function SetCookie( name, value) {
    var today = new Date(); today.setTime( today.getTime() );
    
    var expires_date = new Date( today.getTime() + 126144000000 );
    
    document.cookie = name + "=" +escape( value ) +
    ";expires=" + expires_date.toGMTString() + 
    ";path=/" + ";domain=ledger-enquirer.com" ;
}
// validate and fetch arguments, if the argument is missing and optional, we return an empty string        
SiteLifeProxy.prototype.__GetArgument = function(variableName, variableValue, isRequired, isArray) {
    this.OnDebug("__GetArgument " + variableName + "," + variableValue + "," + isRequired + "," + isArray);
    if (typeof variableValue == "undefined" || variableValue == null || variableValue == "")
    {
        if (isRequired)
        {
            this.OnError("Missing required parameter " + variableName);
            this.__isValid = false;
            return "";
        }
        else
            return "";
    }
    if (isRequired && isArray) 
    {
        if (!this.__ArrayValidation(variableValue)) 
        {
            this.OnError("Invalid array parameter " + variableName);
            this.__isValid = false;
            return "";
        }
    }
    return "&" + variableName + "=" + this.EscapeValue(variableValue);
};

SiteLifeProxy.prototype.__StripAnchorFromUrl = function(url) {
    var aIdx = url.indexOf("#");
    return aIdx == -1 ? url : url.substring(0, aIdx);
}

SiteLifeProxy.prototype.__SafeAppendUrlValue = function(url, key, value) {
    url += url.indexOf("?") != -1 ? "&" : "?";
    return url + key + "=" + value;
}

SiteLifeProxy.prototype.__AppendUrlValues = function (url)
{
	time = new Date();
    url += this.__GetArgument("plckNoCache", time.getTime(), false, false);
    url += this.__GetArgument("plckApiKey", this.apiKey, true, false);
                        url += this.__GetArgument("sid", gSiteLife.SID, false, false);
                
    return url;
}

SiteLifeProxy.prototype.ReloadPage = function(params) {
    var sSearch = window.location.search.substring(1);
    var sNVPs = sSearch.split('&');
    var newSearch = "";
    var anchorPoint = "";
    for(var k in params) {
        if(k == "extend") continue;
		if(k == "#") {
			anchorPoint = '#' + params[k];
			continue;
		}		
        if(newSearch == "") newSearch += "?"; else newSearch += "&";
        newSearch += k + '=' + params[k];
    }
    for (var i = 0; i < sNVPs.length; i++) {
        var kv = sNVPs[i].split('=');
        if(kv[0] && kv[0].indexOf('plck') != 0 && ! params[kv[0]]) {
            newSearch += "&" + sNVPs[i];        
        }
    }
            
    if(anchorPoint != ""){ 
        window.location.hash = anchorPoint;
    }
    window.location.search = newSearch;
}

function loadScript (url, callback) {
	var script = document.createElement('script');
	script.type = 'text/javascript';
	script.charset = 'utf-8';
	if (callback)
		script.onload = script.onreadystatechange = function() {
			if (script.readyState && script.readyState != 'loaded' && script.readyState != 'complete')
				return;
			script.onreadystatechange = script.onload = null;
			callback();
		};
	script.src = url;
	document.getElementsByTagName('head')[0].appendChild (script);
}

SiteLifeProxy.prototype.__Send = function(url, scriptToUse, callbackName, args) {
    this.OnDebug("_Send " + url);
    function gLoadScript(url, callbackName) {
      var script = document.createElement('script');
      script.setAttribute('type', 'text/javascript');
    	script.setAttribute('charset', 'utf-8');
    	script.setAttribute('src', url + (callbackName ? '&EVENT_ID=' + callbackName : ''));
    	document.getElementsByTagName('head')[0].appendChild (script);
    }
    function bind(_function, _this, _arguments) {
      var f = function() {
        _function.apply(_this, _arguments);
      };
      f['__Bound'] = true;
      return f;
    };
    var func;
    if ((typeof callbackName == 'string') && (func = this.__eventHandlers[callbackName]) && (typeof func == 'function') && !func['__Bound']) {
      this.__eventHandlers[callbackName] = bind(func, this, args);
    }
    
    //append our various parameters as necessary
    url = this.__AppendUrlValues(url);
    this.OnDebug("_Send (updated) " + url);
    // add the script node to the document
    if (document.createElement && ! this.__isMacIE) {
        gLoadScript(url, callbackName);
        return;
    }

    // could fall back to sync at this point, but will bust if the page is already loaded

    this.OnError("No support for async in this browser");
}

SiteLifeProxy.prototype.Logout = function(ScriptToUse, IsRestPage) {
    var plckRest = IsRestPage ? true : false;
    this.__Send(this.__baseUrl + '/Utility/Logout?plckRedirectUrl=' + escape(window.location.href) + '&plckRest=' + plckRest, ScriptToUse);
    return false;
}

SiteLifeProxy.prototype.AddLoadEvent = function(func) {
if(window.addEventListener){
 window.addEventListener("load", func, false);
}else{
 if(window.attachEvent){
   window.attachEvent("onload", func);
 }else{
   if(document.getElementById){
    var oldonload = window.onload;
    if (typeof window.onload != 'function') {
      window.onload = func;
    } else {
      window.onload = function() {
       if (oldonload) {
        oldonload();
       }
       func();
}}}}}}

SiteLifeProxy.prototype.AdInsertHelper = function() {
    for(var src in gSiteLife.__adsToInsert) {
        if(src == "extend") continue;
        var dest = gSiteLife.__adsToInsert[src];
        var parent = document.getElementById(dest);
		var newChild = document.getElementById(src);
		if( ! parent || ! newChild ) {continue; }
		parent.replaceChild( newChild, document.getElementById(dest + "Child"));
		newChild.style.display = "block"; parent.style.display = "block";
    }
}

SiteLifeProxy.prototype.InsertAds = function(source, destination) {
gSiteLife.__adsToInsert = new Object();
for(ii=0; ii< this.InsertAds.arguments.length; ii+=2) { gSiteLife.__adsToInsert[this.InsertAds.arguments[ii]] = this.InsertAds.arguments[ii+1];}
this.AddLoadEvent(gSiteLife.AdInsertHelper);
}

SiteLifeProxy.prototype.TitleTag = function() {
 var titleTag = document.getElementById("plckTitleTag");
 return titleTag ? titleTag.innerText || titleTag.textContent : null;
 }

SiteLifeProxy.prototype.WriteDiv = function(id, divClass) {
    var cssClass = divClass ? divClass : "";
    document.write('<div id="'+id+'" class="'+cssClass+'"></div>'); return id;
}

SiteLifeProxy.prototype.InnerHtmlWrite = function(elementId, innerContents ) {
    var el = document.createElement("div");
    try {
        if(document.location.href.indexOf("debug=true") > -1) {
            el.innerHTML += "<div style='border:1px solid red;'><span style='background-color:red; color:white; position:absolute; cursor:pointer; font-size:8pt;' onclick='DebugShowInnerHTML(\"${plckElementId}\",\"http://pluck.ledger-enquirer.com/ver1.0/Proxies/Default.rails?&sid=pluck.ledger-enquirer.com\");'>&nbsp;?&nbsp;</span><div>" + innerContents + "</div></div>";
        } else {
            el.innerHTML += innerContents;
            el.style.display = "inline";
        }
        var destDiv = document.getElementById(elementId);
        while (destDiv.childNodes.length >= 1) {
             destDiv.removeChild(destDiv.childNodes[0]);
        }
        
        destDiv.appendChild(el);
    } catch (error) {
        alert(elementId + " Error "  + error.number + ": " + error.description);
    }
}

SiteLifeProxy.prototype.SortTimeStampDescending = "TimeStampDescending";
SiteLifeProxy.prototype.SortTimeStampAscending = "TimeStampAscending";
SiteLifeProxy.prototype.SortRecommendationsDescending = "RecommendationsDescending";
SiteLifeProxy.prototype.SortRecommendationsAscending = "RecommendationsAscending";
SiteLifeProxy.prototype.SortRatingDescending = "RatingDescending";
SiteLifeProxy.prototype.SortRatingAscending = "RatingAscending";
SiteLifeProxy.prototype.SortAlphabeticalAscending = "AlphabeticalAscending";
SiteLifeProxy.prototype.SortAlphabeticalDescending = "AlphabeticalDescending";
SiteLifeProxy.prototype.KeyTypeExternalResource = "ExternalResource";
        



SiteLifeProxy.prototype.PersonaHeaderRequest = function(UserId) {
    var url = this.__baseUrl + '/Persona/PersonaHeader?plckElementId=personaHDest&plckUserId='+ UserId;
    this.__Send(url, "personaHeaderScript", 'persona:header', arguments);
}
SiteLifeProxy.prototype.PersonaHeader = function(UserId) {
    this.WriteDiv("personaHDest", "Persona_Main");
        this.PersonaHeaderRequest(UserId); 
}
SiteLifeProxy.prototype.PersonaHeaderInbox = function() {
	// if DAAPI proxy is not present, fail gracefully
	if (!document.getElementById('PrivateMessageInbox') || !window.RequestBatch || !window.PrivateMessageFolderList) {
		var pmContainer = document.getElementById('PersonaHeader_PrivateMessageContent');
		if (pmContainer) {
			pmContainer.style.display = 'none';
		}
		return;
	}

	var rb = new RequestBatch();
	rb.AddToRequest(new PrivateMessageFolderList());
	rb.BeginRequest(serverUrl,
		function(responseBatch) {
			var count = '';
			try {
				if (responseBatch && responseBatch.Messages && responseBatch.Messages.length && responseBatch.Messages[0].Message == 'ok') {
					var folders = responseBatch.Responses[0].PrivateMessageFolderList.FolderList;
					for (var i = 0; i < folders.length; i++) {
						var f = folders[i];
						if (f.FolderID == 'Inbox') { count = f.UnreadMessageCount; break; }
					}
				}
			} catch (e) {}
			var inboxStr = "Inbox ({0})";
			var idx = inboxStr.indexOf("{0}");
			if (inboxStr == '' || idx >= -1)
				inboxStr = inboxStr.substring(0, idx) + count + inboxStr.substring(idx+3);
			var inbox = document.getElementById('PrivateMessageInbox');
			inbox.innerHTML = inboxStr;
			if (count > 0) inbox.style.fontWeight = 'bold';
		});
}

SiteLifeProxy.prototype.Persona = function(UserId) {
    this.WriteDiv("personaDest", "Persona_Main");
    var action = this.GetParameter("plckPersonaPage");
    if(action && (typeof this[action] == 'function')) this[action](UserId);
             else this.PersonaHome(UserId);
    }
SiteLifeProxy.prototype.LoadPersonaPage = function(PageName, UserId) {
    var params = new Object(); params['plckPersonaPage'] = PageName; params['plckUserId'] = UserId;
            params['insiteUserId'] = UserId;
        for(ii=2; ii< this.LoadPersonaPage.arguments.length; ii+=2) { params[this.LoadPersonaPage.arguments[ii]] = this.LoadPersonaPage.arguments[ii+1];}
    this.ReloadPage(params);
    return false;
}

SiteLifeProxy.prototype.PersonaHome = function(UserId) {

    var me = this;
    this.AddEventHandler('persona:home:complete', function() { me.PopulateGroupsDiv(UserId, 1); });
    return this.PersonaSend('PersonaHome', 'personaDest', 'personaScript', UserId, null, 'persona:home:complete');
	  
}

SiteLifeProxy.htmlEncode = function(str){
	// Fix HTML
	var ret = str;
	var div = document.createElement('div');
	var text = document.createTextNode(str);
	div.appendChild(text);
	ret = new String(div.innerHTML);				
	
	// The above doesn't take care of quotes.
	ret = ret.replace(/"/g, '&quot;');
	
	return ret;
};
			
SiteLifeProxy.prototype.PopulateGroupsDiv = function(UserId, OnPage) {
        // a utility function to compare two urls for purposes of determining site of origin
    var isFromThisSite = function(siteOfOrigin, currentHost) {
        // assume each url has periods in it
        var siteOfOriginDotIndex = siteOfOrigin.indexOf('.');
        var currentHostDotIndex = currentHost.indexOf('.')
        if (siteOfOriginDotIndex < 0 || currentHostDotIndex < 0) {
            return false;
        }
        else {
            return siteOfOrigin.slice(siteOfOriginDotIndex).toLowerCase() == currentHost.slice(currentHostDotIndex).toLowerCase();
        }
    }
        // check for DAAPI objects; if not there, fail gracefully
    if (window.RequestBatch && window.CommunityGroupMembershipPage && window.UserKey) {
        var requestBatch = new RequestBatch();
        requestBatch.AddToRequest(new CommunityGroupMembershipPage(new UserKey(UserId), 8, OnPage, "TimeStampAscending", "Member"));
        requestBatch.BeginRequest("http://pluck.ledger-enquirer.com/ver1.0/Direct/Process", function(responseBatch) {   
            if (responseBatch.Responses.length > 0 && responseBatch.Responses[0].CommunityGroupMembershipPage) {
                // create the div that will house all this info
                var groupsDiv = document.createElement('div');
                groupsDiv.className = 'PersonaStyle_ItemContainer';
                var groupsContainer = document.getElementById('PersonaStyle_GroupsContainer');
                // Check groupsContainer is null because PersonaStyle_GroupContainer may be absent due to private persona files.
                if (groupsContainer != null) {
                    groupsContainer.appendChild(groupsDiv);
                        
                    var groupBaseUrl = "http://www.ledger-enquirer.com/groups/CommunityGroup.html";
                    var groupMembershipPage = responseBatch.Responses[0].CommunityGroupMembershipPage;
                    var groupsHtml = "<div class=\"PersonaStyle_SectionHead\">Groups</div>";
                    groupsHtml += "<div class=\"PersonaStyle_GroupList\">";
                    for (var index = 0; index < groupMembershipPage.CommunityGroupMemberships.length; index++) {
                        var currentGroup = groupMembershipPage.CommunityGroupMemberships[index].CommunityGroup;
                        // if current group is private and user is non-member, don't display
                        var display = true;
                        if (currentGroup.CommunityGroupVisibility == 'Private') {
                            display = (currentGroup.RequestingUsersMembershipTier != 'NonMember' && currentGroup.RequestingUsersMembershipTier != 'Banned');
                        }
                        if (display) {
                            var groupUrl = groupBaseUrl + "?slGroupKey=" + currentGroup.CommunityGroupKey.Key;
                                                            if (!isFromThisSite(currentGroup.SiteOfOrigin, window.location.host)) {
                                    groupsHtml += "<img height=\"50\" width=\"50\" title=\"" + SiteLifeProxy.htmlEncode(currentGroup.Title) + "\" src=\"" + currentGroup.AvatarImageUrl + "\" />";
                                }
                                else {
                                    groupsHtml += "<a href=\"" + groupUrl + "\"><img height=\"50\" width=\"50\" title=\"" + SiteLifeProxy.htmlEncode(currentGroup.Title) + "\" src=\"" + currentGroup.AvatarImageUrl + "\" /></a>";
                                }
                                                    }
                    }
                    //Pagination for Group List
                    groupsHtml += "<p><ul class=\"PersonaStyle_GroupListPagination\">";
                    
                    if (groupMembershipPage.OnPage > 1)                {
                        groupsHtml += "<li><a href='#PreviousGroup' onclick='gSiteLife.PopulateGroupsDiv(\"" + UserId + "\", " + (parseInt(groupMembershipPage.OnPage) - 1) + ");'>&lt;&lt;Previous</a></li>";
                    }
                    
                    if (groupMembershipPage.NumberOfCommunityGroupMemberships > (groupMembershipPage.NumberPerPage * groupMembershipPage.OnPage))                {
                        groupsHtml += "<li><a href='#NextGroup' onclick='gSiteLife.PopulateGroupsDiv(\"" + UserId + "\", " + (parseInt(groupMembershipPage.OnPage) + 1) + ");'>Next&gt&gt;</a></li>";
                    }
                    groupsHtml += "</p>";
                    
                    //End Pagination for Group List            
                    groupsHtml += "</ul><div class=\"PersonaStyle_GroupListClear\"></div>";                   
                    groupsHtml += "</div>";                   
                    groupsDiv.innerHTML = groupsHtml;
                    
                   
                    groupsContainer.appendChild(groupsDiv);
                }   
            }
        });
    }
    // fire any other events
    this.FireEvent('persona:home');
}

SiteLifeProxy.prototype.WatchItem = function(Controller,Method,WatchKey, targetDiv) {
    var url = this.__baseUrl + '/'+Controller+'/' + Method + '?' + 'plckWatchKey=' + WatchKey + '&plckElementId=' + targetDiv + '&plckWatchUrl=' + this.EscapeValue(window.location.href);
    this.__Send(url, "AddWatchScript");
    return false;
}
SiteLifeProxy.prototype.PersonaRemoveWatchItem= function(UserId, WatchKey, Div, View) {
   return this.PersonaSend('PersonaRemoveWatchItem', Div, 'personaScript', UserId, 'plckWatchView=' + View + '&plckWatchKey=' + WatchKey);
}
SiteLifeProxy.prototype.PersonaAddFriend= function(UserId) {
   return this.PersonaSend('PersonaAddFriend', 'personaHDest', 'personaScript', UserId);
}
SiteLifeProxy.prototype.PersonaRemoveFriend = function(UserId, Friend, Div, View, Expanded, confirmMsg) {
   if(!Expanded) Expanded = "false";
   if (confirm(confirmMsg) == true) {
    return this.PersonaSend('PersonaRemoveFriend', Div, 'personaScript', UserId, 'plckFriendView=' + View + '&plckFriend=' + Friend + '&plckExpanded=' + Expanded);
   }
   return false;
}
SiteLifeProxy.prototype.PersonaRemovePendingFriend = function(UserId, PendingFriend, Div, confirmMsg) {
   if (confirm(confirmMsg) == true) {
    return this.PersonaSend('PersonaRemovePendingFriend', Div, 'personaScript', UserId, 'plckPendingFriend=' + PendingFriend);
   }
   return false;
}
SiteLifeProxy.prototype.PersonaAddPendingFriend = function(UserId, PendingFriend, Div) {
    return this.PersonaSend('PersonaAddPendingFriend', Div, 'personaScript', UserId, 'plckPendingFriend=' + PendingFriend);
}
SiteLifeProxy.prototype.PersonaMessages = function(UserId) {
   var AdParams = this.GetParameter('plckCurrentPage') ? 'plckCurrentPage=' + this.GetParameter('plckCurrentPage') : "";
   var scrl = this.GetParameter('plckScrollToAnchor');  if(scrl){ if(AdParams) {AdParams +='&';} AdParams += 'plckScrollToAnchor=' + scrl;}
   if(this.GetParameter('plckMessageSubmitted')){if(AdParams) {AdParams +='&';} AdParams += 'plckMessageSubmitted=' + this.GetParameter('plckMessageSubmitted');}
   return this.PersonaSend('PersonaMessages', 'personaDest', 'personaScript', UserId, AdParams, 'persona:messages');
}
SiteLifeProxy.prototype.PersonaComments = function(UserId) {
   var AdParams = this.GetParameter('plckCurrentPage') ? 'plckCurrentPage=' + this.GetParameter('plckCurrentPage') : "";
   return this.PersonaSend('PersonaComments', 'personaDest', 'personaScript', UserId, AdParams, 'persona:comments');
}
SiteLifeProxy.prototype.PersonaBlog = function(UserId) {
   var AdParams = this.GetParameter('plckCurrentPage') ? 'plckCurrentPage=' + this.GetParameter('plckCurrentPage') : "";
   if(AdParams) {AdParams +='&';} AdParams += 'plckBlogId=' + UserId;
   var url = this.__baseUrl + '/PersonaBlog/PersonaBlog?plckElementId=personaDest&plckUserId='+ UserId + '&' + AdParams;
   this.__Send(url, 'personaScript', 'persona:blog', arguments);
   return false;
}
SiteLifeProxy.prototype.PersonaProfile = function(UserId) {
    return this.PersonaSend('PersonaProfile', 'personaDest', 'personaScript', UserId, null, 'persona:profile');
}
SiteLifeProxy.prototype.PersonaWatchListPaginate = function(UserId, pageNum) { 
    return this.PersonaPaginate('WatchList', pageNum, UserId);
}
SiteLifeProxy.prototype.PersonaFriendsPaginate = function(UserId, pageNum) { 
	var AdParam = "plckFullFriendsList=true";
    return this.PersonaPaginate('Friends', pageNum, UserId, AdParam);
}

SiteLifeProxy.prototype.PersonaFriendsExpand= function(UserId) { 
    var url = this.__baseUrl + '/Persona/PersonaFriends?plckFullFriendsList=true&plckFriendsPageNum=0&plckElementId=PersonaFriendsDest&plckUserId='+ UserId;
    this.__Send(url, 'PersonaFriendsScript');
    return false;
}
SiteLifeProxy.prototype.PersonaFriendsCollapse= function(UserId, pageNum) { 
    var url = this.__baseUrl + '/Persona/PersonaFriends?plckFullFriendsList=false&plckFriendsPageNum=0&plckElementId=PersonaFriendsDest&plckUserId='+ UserId;
    this.__Send(url, 'PersonaFriendsScript');
    return false;
}

SiteLifeProxy.prototype.PersonaPendingFriendsPaginate = function(UserId, pageNum) { 
    var AdParam = "plckPendingFriendsPageNum=" + pageNum;
    return this.PersonaPaginate('Friends', 0, UserId,AdParam);
}
SiteLifeProxy.prototype.PersonaMessagesPreviewPaginate = function(UserId, pageNum) { 
    return this.PersonaPaginate('MessagesPreview', pageNum, UserId);
}
SiteLifeProxy.prototype.PersonaMessageRemove = function(UserId, pageNum, MessageKey, confirmMsg) { 
   if (confirm(confirmMsg) == true) {
        return this.PersonaSend('PersonaRemoveMessage', 'personaDest', 'PersonaMessagesPageScript', UserId, 'plckCurrentPage='+ pageNum + '&plckMessageKey='+MessageKey);
   }
   return false;
}
SiteLifeProxy.prototype.PersonaSend = function(ApiName, DestDiv, ScriptName, UserId, AddParams, eventId){
    var url = this.__baseUrl + '/Persona/' + ApiName + '?plckElementId=' + DestDiv + '&plckUserId='+ UserId;
    if(AddParams) url += '&' + AddParams;
    this.__Send(url, ScriptName, eventId, arguments);
    return false;
}

SiteLifeProxy.prototype.PersonaPaginate = function(ApiName, PageNum, UserId, AddParams){
    var url = this.__baseUrl + '/Persona/Persona' + ApiName + '?plck' + ApiName + 'PageNum=' + PageNum + '&plckElementId=Persona' + ApiName + 'Dest&plckUserId='+ UserId;
    if(AddParams) url += '&' + AddParams;    
    this.__Send(url, 'Persona'+ ApiName + 'Script');
    return false;
}

SiteLifeProxy.prototype.PersonaPhotoSend = function(ApiName, DestDiv, ScriptName, UserId, AddParams, eventId){
    var url = this.__baseUrl + '/PersonaPhoto/' + ApiName + '?plckElementId=' + DestDiv + '&plckUserId='+ UserId;
    if(AddParams) url += '&' + AddParams;
    this.__Send(url, ScriptName, eventId, arguments);
    return false;
}

SiteLifeProxy.prototype.PersonaMostRecent = function(UserId, PhotoID, DestDiv) {
   return this.PersonaPhotoSend('PersonaMostRecent', DestDiv, 'personaScript', UserId,'plckPhotoID=' + PhotoID);
}

SiteLifeProxy.prototype.PersonaCommunityGroupsPaginate = function(UserId, PageNum){
	return this.PersonaPaginate('CommunityGroups', PageNum, UserId);
}

SiteLifeProxy.prototype.PersonaCreateGallery = function(UserId) {
     return this.PersonaPhotoSend('UserGalleryCreate', 'personaDestPhoto', 'personaScript', UserId);
}

SiteLifeProxy.prototype.PersonaEditGallery = function(UserId,GalleryID) {
     return this.PersonaPhotoSend('UserGalleryEdit', 'userGalleryDest', 'personaScript', UserId,'plckGalleryID=' + GalleryID);
}

SiteLifeProxy.prototype.PersonaUploadToUserGallery = function(GalleryId) {
    var url = this.__baseUrl + '/Photo/PhotoUpload?plckElementId=userGalleryDest&plckGalleryID='+ GalleryId;
    this.__Send(url);
    return false;
}

SiteLifeProxy.prototype.PersonaPhotos = function(UserId) {
     return this.PersonaPhotoSend('PersonaPhotos', 'personaDest', 'personaScript', UserId, null, 'persona:photos');
}
SiteLifeProxy.prototype.PersonaAllPhotos = function(UserId) {
     return this.PersonaPhotoSend('PersonaAllPhotos', 'personaDest', 'personaScript', UserId);
}

SiteLifeProxy.prototype.PersonaGalleryPhoto = function(UserId, plckFindCommentKey) {
	var findCommentKey = gSiteLife.ReadFindCommentKey(findCommentKey, "widget:personaGalleryPhoto");
	
    return this.PersonaPhotoSend('PersonaGalleryPhoto', 'personaDest', 'personaScript', UserId, 'plckFindCommentKey=' + findCommentKey, "widget:personaGalleryPhoto");
}
SiteLifeProxy.prototype.PersonaMyRecentPhotos = function(UserId,ElementId, PageNum) {
     return this.PersonaPhotoSend('PersonaMyRecentPhotos', ElementId, 'personaScript', UserId,'plckPageNum=' + PageNum);
}

SiteLifeProxy.prototype.PersonaGallery = function(UserId,GalleryId,PageNum) {
     if(!PageNum){
        PageNum = gSiteLife.GetParameter("plckPageNum") ? gSiteLife.GetParameter("plckPageNum") : 0;
     }
     if(!GalleryId) {
        GalleryId = gSiteLife.GetParameter("plckGalleryID");
     }
     return this.PersonaPhotoSend('PersonaGallery', 'personaDest', 'personaScript', UserId,'plckGalleryID='+ GalleryId + '&plckPageNum=' + PageNum);
}

SiteLifeProxy.prototype.UserGalleryList = function(UserId,ElementId, PageNum) {
     return this.PersonaPhotoSend('UserGalleryList', ElementId, 'personaScript', UserId,'plckPageNum=' + PageNum);
}
SiteLifeProxy.prototype.PersonaGallerySubmissions = function(UserId,ElementId, PageNum){
     return this.PersonaPhotoSend('PersonaGallerySubmissions', ElementId, 'personaScript', UserId,'plckPageNum=' + PageNum);
} 

SiteLifeProxy.prototype.PersonaGalleryPhoto = function(UserId, plckFindCommentKey) {
	var findCommentKey = gSiteLife.ReadFindCommentKey(findCommentKey, "widget:personaPhoto");
    
    var photoid = gSiteLife.GetParameter('plckPhotoID');
    return this.PersonaPhotoSend('PersonaGalleryPhoto', 'personaDest','personaScript', UserId,'&plckPhotoID=' +photoid + '&plckFindCommentKey=' +findCommentKey, "widget:personaPhoto");
}
SiteLifeProxy.prototype.PersonaRecentGalleryPhoto = function(UserId) {
    var photoid = gSiteLife.GetParameter('plckPhotoID');
    return this.PersonaPhotoSend('PersonaRecentGalleryPhoto', 'personaDest','personaScript', UserId,'&plckPhotoID=' +photoid);
}

SiteLifeProxy.prototype.LoadPersonaGalleryPage = function(UserId,GalleryID) {
    var params = new Object(); params['plckPersonaPage'] = 'PersonaGallery'; params['plckUserId'] = UserId; 
            params['insiteUserId'] = UserId;
        params['plckGalleryID'] = GalleryID;
    this.ReloadPage(params);
    return false;
}
SiteLifeProxy.prototype.LoadPersonaPhotoPage = function(UserId,PhotoID) {
    var params = new Object(); params['plckPersonaPage'] = 'PersonaGalleryPhoto'; params['plckUserId'] = UserId;
            params['insiteUserId'] = UserId;
        params['plckPhotoID'] = PhotoID;
    this.ReloadPage(params);
    return false;
}
SiteLifeProxy.prototype.LoadPersonaRecentPhotoPage = function(UserId,PhotoID) {
    var params = new Object(); params['plckPersonaPage'] = 'PersonaRecentGalleryPhoto'; params['plckUserId'] = UserId;
            params['insiteUserId'] = UserId;
        params['plckPhotoID'] = PhotoID;
    this.ReloadPage(params);
    return false;
}

var fbHelpDialogTimeout;
SiteLifeProxy.prototype.ShowFacebookHelpDialog = function(icon){
	var x = 0;
	var y = icon.clientHeight/2;

	do {
		x += icon.offsetLeft;
		y += icon.offsetTop;
	}
	while(icon = icon.offsetParent);

	var fb_div = document.getElementById("Persona_FacebookHelpDialog");
	
	fb_div.style.position = "absolute";
	fb_div.style.display = "block";
	
	// position div to the left of icon.
	var newX = x - fb_div.clientWidth;
	var newY = y - Math.floor(fb_div.clientHeight/2);
	
	fb_div.style.left = newX + "px";
	fb_div.style.top = newY + "px";

	return false;
}

SiteLifeProxy.prototype.HideFacebookHelpDialog = function(){
	var fb_div = document.getElementById("Persona_FacebookHelpDialog");
	fb_div.style.display = "none";
}

SiteLifeProxy.prototype.CopyRssUrlToClipboard = function(){	
	rssUrl = document.getElementById("rssUrl");
	copy(rssUrl);
	
	return false;
}

/* note: doesn't work with flash 10 */
function copy(inElement) {
  if (inElement.createTextRange) {
    var range = inElement.createTextRange();
    if (range)
      range.execCommand('Copy');
  } else {
    var flashcopier = 'flashcopier';
    if(!document.getElementById(flashcopier)) {
      var divholder = document.createElement('div');
      divholder.id = flashcopier;
      document.body.appendChild(divholder);
    }
    document.getElementById(flashcopier).innerHTML = '';
    var divinfo = '<embed src="' + gSiteLife.__baseUrl + '/Content/swf/clipboard.swf" FlashVars="clipboard='+encodeURIComponent(inElement.value)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
    document.getElementById(flashcopier).innerHTML = divinfo;
  }
}

SiteLifeProxy.prototype.UpdateExternalUserId = function(ExternalSiteName, ExternalSiteUserId) {
	var adParam = this.BaseAdParam();
	adParam += "&externalSiteName=" + ExternalSiteName;
	adParam += "&externalSiteUserId=" + ExternalSiteUserId;
	return this.PersonaSend('UpdateExternalUserId', 'personaHDest', 'personaScript', adParam);
}






SiteLifeProxy.prototype.SolicitPhoto = function(galleryID) {
	var elementId = 'plcksolicit' + galleryID;
	this.WriteDiv(elementId);
    var url = this.__baseUrl + '/Photo/SolicitPhoto?plckElementId=' + elementId + '&plckGalleryID=' +galleryID;
    this.__Send(url);
    return false;
}

SiteLifeProxy.prototype.PhotoUpload = function() {
	var elementId = 'plcksubmit';
	this.WriteDiv(elementId);
    var galleryID = gSiteLife.GetParameter('plckGalleryID');

    var url = this.__baseUrl + '/Photo/PhotoUpload?plckElementId=' + elementId + '&plckGalleryID=' +galleryID;
    this.__Send(url);
    return false;
}

SiteLifeProxy.prototype.PublicGallery = function() {
    var elementId = 'plckgallery';
	this.WriteDiv(elementId);
	var galleryID = gSiteLife.GetParameter('plckGalleryID');
    var pageNum = gSiteLife.GetParameter('plckPageNum');
	
    var url = this.__baseUrl + '/Photo/PublicGallery?plckElementId=' + elementId + '&plckGalleryID=' +galleryID + '&plckPageNum=' +pageNum;
	this.__Send(url);
	return false;
}


SiteLifeProxy.prototype.GalleryPhoto = function() {
	var elementId = 'plckphoto';
	this.WriteDiv(elementId);
    var photoid = gSiteLife.GetParameter('plckPhotoID');
    var findCommentKey = gSiteLife.ReadFindCommentKey(null, "widget:galleryPhoto");

    var url = this.__baseUrl + '/Photo/GalleryPhoto?plckElementId=' + elementId + '&plckPhotoID=' +photoid + '&plckFindCommentKey=' + findCommentKey;
	this.__Send(url, null, "widget:galleryPhoto");
	return false;
}

SiteLifeProxy.prototype.PublicGalleries = function() {
	var elementId = 'plckgalleries';
	this.WriteDiv(elementId);
    var pageNum = gSiteLife.GetParameter('plckPageNum') ?  gSiteLife.GetParameter('plckPageNum') : "0";

    var url = this.__baseUrl + '/Photo/PublicGalleries?plckElementId=' + elementId + '&plckPageNum=' + pageNum;
    this.__Send(url);
    return false;
}

SiteLifeProxy.prototype.PhotoRecommend = function(targetid,recommendDiv,isGallery) {
    var url = this.__baseUrl + '/Photo/Recommend?plckElementId=' + recommendDiv + '&plckTargetid=' +targetid + '&plckIsGallery=' +isGallery ;
    this.__Send(url);
    return false;
}

//<script type="text/javascript">

//parentKeyType can be any gSiteLife.KeyType* value, but for including this widget on an article page the value is 
//typically gSiteLife.KeyTypeExternalResource
SiteLifeProxy.prototype.Comments = function(parentKeyType, parentKey, pageSize, sort, showTabs, tab, parentUrl, parentTitle, refreshPage, findCommentKey)
{
	return this.CommentsInternal(parentKeyType, parentKey, pageSize, sort, showTabs, tab, parentUrl, parentTitle, false, false, null, refreshPage, findCommentKey);
};

SiteLifeProxy.prototype.CommentsInput = function(parentKeyType, parentKey, redirectToUrl)
{    
    return this.CommentsInternal(parentKeyType, parentKey, null, "TimeStampDescending", null, null, null, null, true, false, redirectToUrl, false, null);
};

SiteLifeProxy.prototype.CommentsOutput = function(parentKeyType, parentKey, refreshPage, pageSize, sortOrder)
{
    sortOrder = sortOrder || "TimeStampDescending";
	return this.CommentsInternal(parentKeyType, parentKey, pageSize, sortOrder, null, null, null, null, false, true, null, refreshPage, null);
}

SiteLifeProxy.prototype.CommentsRefresh = function(parentKeyType, parentKey, pageSize, sortOrder)
{
    if (!parentKey || parentKey == "") throw "Must pass in value for parentKey!";
    return this.CommentsInternal(parentKeyType, parentKey, pageSize, sortOrder, null, null, null, null, false, false, null, true, null);
}

SiteLifeProxy.prototype.CommentsInternal = function(parentKeyType, parentKey, pageSize, sort, showTabs, tab, parentUrl, parentTitle, hideView, hideInput, redirectToUrl, refreshPage, findCommentKey)
{
    var divId = 'Comments_Container';
    if(this.numCommentsWidgets){ divId += this.numCommentsWidgets++; } else { this.numCommentsWidgets = 1; }
    
    document.write("<div id='" + divId + "'></div>");
    
    return this.GetComments(parentKeyType, parentKey, parentUrl, parentTitle, 0, pageSize, sort, showTabs, tab, hideView, hideInput, redirectToUrl, refreshPage, divId, findCommentKey);
}

SiteLifeProxy.prototype.ReadFindCommentKey = function(plckFindCommentKey, eventName){
	var findCommentKey = plckFindCommentKey || gSiteLife.GetParameter("plckFindCommentKey") || "";
    if(findCommentKey == "none"){
		findCommentKey = "";
    }
    
    if(findCommentKey != "" && eventName){
		this.AddEventHandler(eventName, function(){gSiteLife.ScrollToComment(findCommentKey)});
    }
    
    return findCommentKey;
}

SiteLifeProxy.prototype.GetComments = function(parentKeyType, parentKey, parentUrl, parentTitle, page, pageSize, sort, showTabs, tab, hideView, hideInput, redirectTo, refreshPage, divId, findCommentKey)
{
    parentKeyType = parentKeyType || "ExternalResource";
    parentUrl = parentUrl || gSiteLife.__StripAnchorFromUrl(window.location.href);
    parentUrl = gSiteLife.EscapeValue(parentUrl);
    parentKey = parentKey || gSiteLife.__StripAnchorFromUrl(window.location.href);
    parentTitle = parentTitle || gSiteLife.EscapeValue(gSiteLife.Trim(document.title));
    page = page || gSiteLife.GetParameter('plckCurrentPage') || 0;
    pageSize = pageSize || 10;
    sort = sort || "TimeStampAscending";
    showTabs = showTabs || false;
    tab = tab || "MostRecent";
    hideView = hideView || false;
    hideInput = hideInput || false;
    redirectTo =gSiteLife.EscapeValue(redirectTo) || "";
    refreshPage = refreshPage || false;
    findCommentKey = gSiteLife.ReadFindCommentKey(findCommentKey, "widget:comments");
    
    var url = this.__baseUrl + 
        '/Comment/GetPage.rails?plckTargetKeyType='+ parentKeyType + 
        '&plckTargetKey=' + escape(parentKey) + 
        "&plckCurrentPage=" + page + 
        "&plckItemsPerPage=" + pageSize + 
        "&plckSort=" + sort + 
        "&plckElementId=" + divId +
        "&plckTargetUrl=" + parentUrl +
        "&plckTargetTitle=" + parentTitle +
        "&plckHideView=" + hideView +
        "&plckHideInput=" + hideInput +
        "&plckRefreshPage=" + refreshPage +
        "&plckRedirectToUrl=" + redirectTo +
        "&plckFindCommentKey=" + findCommentKey;

    if (showTabs) {
        url = url + "&plckShowTabs=true&plckTab=" + tab;
    }
    this.__Send(url, null, "widget:comments");
    return false;
};

SiteLifeProxy.prototype.WaitForImages = function(callback){
	var allImgs = document.images;
	
}

SiteLifeProxy.prototype.ScrollToComment = function(commentKey){
		setTimeout(function(){
		window.location.hash = "#" + commentKey;
	}, 300);
}

SiteLifeProxy.prototype.Blog = function(BlogId) {
    this.WriteDiv("blogDest", "Persona_Main");
    var action = this.GetParameter("plckBlogPage");
    // If BlogId was not explicitly stated, grab it from the URL parameter...
    if(!BlogId){
		BlogId = this.GetParameter('plckBlogId');
    }
    
        
	if(action && action != "Blog" && (typeof this[action] == 'function')){
	 return this[action](BlogId);
	}else{
	   var AdParams = this.GetParameter('plckCurrentPage') ? 'plckCurrentPage=' + this.GetParameter('plckCurrentPage') : "";
	   return this.BlogSend('Blog', 'Blog', 'blogDest', 'blogScript', BlogId, AdParams);
	}
}
SiteLifeProxy.prototype.LoadBlogPage = function(PageName, BlogId) {
    var params = new Object(); params['plckBlogPage'] = PageName; params['plckBlogId'] = BlogId; 
    for(ii=2; ii< this.LoadBlogPage.arguments.length; ii+=2) { params[this.LoadBlogPage.arguments[ii]] = this.LoadBlogPage.arguments[ii+1];}
    this.ReloadPage(params);
    return false;
}

SiteLifeProxy.prototype.BlogViewEdit = function(blogId) {
   return this.BlogSend(null, 'BlogViewEdit', null, null, blogId);
}

SiteLifeProxy.prototype.BlogPostCreate = function(blogId) {
   return this.BlogSend(null, 'BlogPostCreate', null, null, blogId, 'plckRedirectUrl=' + this.GetParameter("plckRedirectUrl"));
}

SiteLifeProxy.prototype.BlogPendingComments = function(blogId, currentPage) {
   if( !currentPage) currentPage = 0;
   return this.BlogSend(null, 'BlogPendingComments', null, null, blogId, 'plckCurrentPage='+currentPage);
}

SiteLifeProxy.prototype.BlogSettings = function(blogId) {
   return this.BlogSend(null, 'BlogSettings', null, null, blogId);
}

SiteLifeProxy.prototype.BlogEditPost = function(blogId, controller, div, script, postId, selection, daysBack) {
	return this.BlogSend(controller, 'BlogPostEdit', div, script, blogId, 'plckPostId=' + postId + '&plckSelection=' + selection + '&plckDaysBack=' + daysBack + '&plckRedirectUrl=' + this.EscapeValue(window.location.href));
}

SiteLifeProxy.prototype.BlogRemovePost = function(blogId, controller, div, script, postId, selection, daysBack, confirmMsg) {
  if (confirm(confirmMsg) == true) {
    return this.BlogSend(controller, 'BlogRemovePost', div, script, blogId, 'plckPostId=' + postId + '&plckSelection=' + selection + '&plckDaysBack=' + daysBack );
  }
  return false;
}

SiteLifeProxy.prototype.BlogViewPost = function(blogId, postId, selection, daysBack) {
    if(!postId ) { postId = gSiteLife.GetParameter('plckPostId'); }
    var findCommentKey = gSiteLife.ReadFindCommentKey(null, "widget:blog");
	return this.BlogSend(null, 'BlogViewPost', null, null, blogId, 'plckPostId=' + postId + '&plckSelection=' + selection + '&plckDaysBack=' + daysBack + '&plckCommentSortOrder=' + this.GetParameter('plckCommentSortOrder') + '&plckFindCommentKey=' + findCommentKey);
}

SiteLifeProxy.prototype.BlogViewMonth = function(blogId, monthId) {
	if(!monthId ) { monthId = gSiteLife.GetParameter('plckMonthId'); }
	var AdParams = 'plckMonthId=' + monthId;
	AdParams += this.GetParameter('plckCurrentPage') ? '&plckCurrentPage=' + this.GetParameter('plckCurrentPage') : "";
	return this.BlogSend(null, 'BlogViewMonth', null, null, blogId,  AdParams);
}

SiteLifeProxy.prototype.AddBlogWatchItem= function(blogId, controller, script, Url, WatchKey) {
   return this.BlogSend(controller, 'AddBlogWatch', 'plckBlogWatchDiv', script, blogId, 'plckWatchKey=' + WatchKey + '&plckWatchUrl=' + this.EscapeValue(Url));
}
SiteLifeProxy.prototype.RemoveBlogWatchItem= function(blogId, controller, script, WatchKey) {
   return this.BlogSend(controller, 'RemoveBlogWatch', 'plckBlogWatchDiv', script, blogId, 'plckWatchKey=' + WatchKey);
}

SiteLifeProxy.prototype.BlogViewTag = function(blogId, tag) {
	if(!tag ) { tag = gSiteLife.GetParameter('plckTag'); }
	var AdParams = 'plckTag=' + tag;
	AdParams += this.GetParameter('plckCurrentPage') ? '&plckCurrentPage=' + this.GetParameter('plckCurrentPage') : "";
	return this.BlogSend(null, 'BlogViewTag', null, null, blogId, AdParams );
}

SiteLifeProxy.prototype.BlogRefreshViewEditList= function(blogId, controller, div, script, selection, daysBack) {
	return this.BlogSend(controller, 'BlogRefreshViewEditList', div, script, blogId, 'plckSelection=' + selection + '&plckDaysBack=' + daysBack  );
}

SiteLifeProxy.prototype.BlogSend = function(controller, apiName, destDiv, scriptName, blogId, addParams){
    if(!controller) controller = this.GetParameter('plckController') || "Blog";
    if(!destDiv) destDiv = this.GetParameter('plckElementId') || "blogDest";
    if(!scriptName) scriptName = this.GetParameter('plckScript') || "blogScript";
    var url = this.__baseUrl + '/' + controller + '/' + apiName + '?plckElementId=' + destDiv + '&plckBlogId=' + blogId + '&' + addParams;
    this.__Send(url, scriptName, 'widget:blog');
    return false;
}

SiteLifeProxy.prototype.Recommend = function(controller, itemId, recommendDiv) {
    var url = this.__baseUrl + '/' + controller + '/Recommend?plckElementId=' + recommendDiv + '&plckItemId=' +itemId;
    this.__Send(url);
    return false;
}
SiteLifeProxy.prototype.BlogSelectPendingComments = function(formId, checked) {   
    var form = document.getElementById(formId);
    for (i=0; i<form.elements.length; i++) {
        var input = form.elements[i];        
        input.checked = checked;
    }
}

SiteLifeProxy.prototype.Forums = function(numPerPage) {    
	this.WriteDiv("forumDest", "Forum_Main");
	
	var action = this.GetParameter("plckForumPage");
		
		
	var forumId = this.GetParameter('plckForumId');        
	if (forumId)
	{
		forumId = unescape(forumId);
		var i = forumId.indexOf('Forum:');
		forumId = forumId.substring(i).replace(':', '_');    
	}
	else
	{
		var discussionId = this.GetParameter('plckDiscussionId');
		if (discussionId)
		{                    
			discussionId = unescape(discussionId);
			var i = discussionId.indexOf('Forum:');
			var j = discussionId.indexOf('Discussion:');
			forumId = discussionId.substring(i, j).replace(':', '_');
		}
	}
    
	var categoryCurrentPage = this.GetParameter('plckCategoryCurrentPage');
	if(action && (typeof this[action] == 'function') && action != 'ForumCategories'){
		this[action]();
	}
	else {     
		if( numPerPage == null ){
			numPerPage = this.GetParameter('plckNumPerPage');
		}
		this.ForumCategories(numPerPage, categoryCurrentPage);
	}
}

SiteLifeProxy.prototype.SetupCallbacks = function(){
	var adParam = "";
    var showFirstUnread = this.GetParameter('plckShowFirstUnread'); 
    var findPostKey = this.GetParameter('plckFindPostKey');
    if(showFirstUnread != null){
		adParam += "&plckShowFirstUnread=" + showFirstUnread;
		this.AddEventHandler("widget:forums", function(){gSiteLife.DiscussionScrollToPost()});
    }
    if(findPostKey != null && findPostKey != ""){
		adParam += "&plckFindPostKey=" + findPostKey;
		this.AddEventHandler("widget:forums", function(){gSiteLife.DiscussionScrollToPost()});
    }
    var showLatestPost = this.GetParameter('plckShowLatestPost'); 
    if(showLatestPost != null){
		adParam += "&plckShowLatestPost=" + showLatestPost;
		this.AddEventHandler("widget:forums", function(){gSiteLife.DiscussionScrollToPost()});
    }
    
    this.AddEventHandler("widget:forums", function(){
		gSiteLife.DiscussionScanForUnread();

		// insert poll widget if the discussion is a poll		

		var me = this;
		var insertPoll = function(retryCount) {
			if (retryCount > 10) {
				return;
			}
			if (typeof(retryCount) === 'undefined') {
				retryCount = 0;
			}
			var pollWidgetDiv = document.getElementById('Discussion_Poll_Container');
			if (pollWidgetDiv) {
				var discussionKey = document.getElementById('DiscussionKeyContainer').value;
				slGetDiscussionPollOnKey = function() {
					return discussionKey;
				}
				window.slPollWidgetDiv = document.getElementById('Discussion_Poll');
				var pollInsertionScript = document.createElement('script');
				pollInsertionScript.type = 'text/javascript';
				pollInsertionScript.src = 'http://pluck.ledger-enquirer.com/ver1.0/Forums/PollParams?plckDiscussionId=' + discussionKey;
				document.getElementsByTagName('head')[0].appendChild(pollInsertionScript);
			}
			else {
				setTimeout(function() {
					insertPoll(retryCount + 1);
				}, 100);
			}
		}
		insertPoll();

    	});
    
    return adParam;
}

SiteLifeProxy.prototype.ForumCategories = function(numPerPage, categoryCurrentPage) {
    var pageNum = this.GetParameter('plckCurrentPage'); if(pageNum == null) pageNum = 0;
    var urlPageInfoStr = '';
    urlPageInfoStr = '&plckNumPerPage=' + numPerPage;        
    urlPageInfoStr += '&plckCategoryCurrentPage=' + categoryCurrentPage;            
    return this.ForumSend("ForumCategories", "forumDest", "ForumMain", 'plckCurrentPage=' + pageNum + urlPageInfoStr);
}
SiteLifeProxy.prototype.Forum = function() {
    var forumId = this.GetParameter('plckForumId');
    var categoryPageNum = this.GetParameter('plckCategoryCurrentPage');
    if(categoryPageNum == null) { categoryPageNum = 0; }
    var discussionPageNum = this.GetParameter('plckCurrentPage');
    if (discussionPageNum == null) { discussionPageNum = 0; }
    var numPerPage = this.GetParameter('plckNumPerPage');
    var urlPageInfoStr = '';
    if( numPerPage != null ){
        urlPageInfoStr = '&plckNumPerPage=' + numPerPage;
    }
   return this.ForumSend('Forum', 'forumDest', 'ForumMain', 'plckForumId=' + forumId + '&plckCurrentPage=' + discussionPageNum + '&plckCategoryCurrentPage=' + categoryPageNum + urlPageInfoStr );
}
SiteLifeProxy.prototype.ForumDiscussion = function() {
    var dId = this.GetParameter("plckDiscussionId");
    var adParam = "plckDiscussionId=" + dId;
    var showLast = this.GetParameter("plckShowLastPage"); if(showLast) adParam += "&plckShowLastPage=true";
    var pageNum = this.GetParameter('plckCurrentPage'); if(pageNum == null) pageNum = 0;
	adParam += this.SetupCallbacks(); 
    adParam += "&plckCurrentPage=" + pageNum;
    adParam += "&plckCategoryCurrentPage=" + this.GetParameter('plckCategoryCurrentPage');   
    
    return this.ForumSend("ForumDiscussion", "forumDest", "ForumMain", adParam);
}

SiteLifeProxy.prototype.DiscussionScanForUnread = function(discussionKey){
	var postDatesContainer = document.getElementById("PostDateInfoContainer");
	if(!postDatesContainer){
		return;
	}
	
	this.postDates = eval(postDatesContainer.value);
	this.latestPost = new Date(document.getElementById("LastReadContainer").value);
	this.screenBottom = 0;
	if(discussionKey){
		this.discussionKey = discussionKey;
	}
	else if (document.getElementById('DiscussionKeyContainer')){
		this.discussionKey = document.getElementById('DiscussionKeyContainer').value;
	}
	
	this.checkForReadInterval = setInterval(function(){gSiteLife.DiscussionCheckForLatestPost();}, 1000);
}

SiteLifeProxy.prototype.DiscussionScrollToPost = function(){
	if(!document.getElementById("Discussion_ScrollToPostKey")){
		return false;
	}
	
	var postKey = document.getElementById("Discussion_ScrollToPostKey").value;
	var post = document.getElementById(postKey);
	
	if(!post){
		return false;
	}
	
	var postTop = 0;
	if(post.offsetParent){
		obj = post;
		do{
			postTop += obj.offsetTop;
		}
		while(obj = obj.offsetParent);
		window.scrollBy(0, postTop);
	}
}

SiteLifeProxy.prototype.IsPostOnScreen = function(screenBottom, postIndex){
	var postId = "readIndicator_" + this.postDates[postIndex].Key;
	var post = document.getElementById(postId);
	if(post){
		var postTop = 0;
		if(post.offsetParent){
			obj = post;
			do{
				postTop += obj.offsetTop;
			}
			while(obj = obj.offsetParent);
		}
		var postBottom = postTop + post.offsetHeight;
		
		if(postBottom < screenBottom){
			return true;
		}
	}
	
	return false;
}

SiteLifeProxy.prototype.DiscussionCheckForLatestPost = function(){
	var screenTop = 0;
	if (typeof(window.pageYOffset) !== 'undefined') {
		screenTop = window.pageYOffset;
	}
	else if (typeof(document.body.scrollTop) !== 'undefined') {
		screenTop = document.body.scrollTop;
	}
	else if (typeof(document.documentElement) !== 'undefined' && typeof(document.documentElement.scrollTop) !== 'undefined') {
		screenTop = document.documentElement.scrollTop;
	}
	
	var screenBottom = Math.pow(2,52); /*Supposing our browser can't get the height, we mark everything as read.*/
	if(window.innerHeight){
		screenBottom = screenTop + window.innerHeight;
	}
	else if(document.documentElement.clientHeight && document.documentElement.clientHeight != 0){
		screenBottom = screenTop + document.documentElement.clientHeight;
	}
	else if(document.body.clientHeight){
		screenBottom = screenTop + document.body.clientHeight;
	}
	
	/* Only update if we've scrolled down since last poll. */
	if(screenBottom <= this.screenBottom){
		return;
	}
	
	/* Just give up if there are no posts. */
	if(!this.postDates || this.postDates.length <= 0){
		clearInterval(this.checkForReadInterval);
		return;
	}
	
	/* If the last post is already marked read, don't bother polling. */
	if(this.postDates[(this.postDates.length - 1)].Timestamp <= this.latestPost){
		clearInterval(this.checkForReadInterval);
		return;
	}
	
	this.screenBottom = screenBottom;
	
	var latestKey = null;
	
	for(i=0; i < this.postDates.length; i++){
		if(this.IsPostOnScreen(screenBottom, i)){
			if(this.postDates[i].Timestamp >= this.latestPost){
				latestKey = this.postDates[i].Key;
				this.latestPost = this.postDates[i].Timestamp;
			}
		}
	}

	if(latestKey){
		this.ForumSetLastRead(this.discussionKey, latestKey);
	}
}

SiteLifeProxy.prototype.ForumCreateDiscussion = function() {
    var adParam = "plckRedirectUrl=" + this.GetParameter("plckRedirectUrl");
    var fId = this.GetParameter("plckForumId"); adParam += "&plckForumId=" + fId;
    var curView = this.GetParameter("plckCurrentView"); if(curView) adParam += "&plckCurrentView=" + curView;
    var curPage = this.GetParameter("plckCurrentPage"); if(curPage) adParam += "&plckCurrentPage=" + curPage;
    var dId = this.GetParameter("plckDiscussionId"); if(dId) adParam += "&plckDiscussionId=" + dId;
    adParam += "&plckCategoryCurrentPage=" + this.GetParameter('plckCategoryCurrentPage');    
    return this.ForumSend("ForumCreateDiscussion", "forumDest", "ForumMain", adParam);
}
SiteLifeProxy.prototype.ForumMain = function() {
    return this.ForumSend("ForumMain", "forumDest", "ForumMain");
}
SiteLifeProxy.prototype.ForumCreatePost = function() {
    var adParam = "plckDiscussionId=" + this.GetParameter("plckDiscussionId") + "&plckRedirectUrl=" + this.EscapeValue(window.location.href);
    var PostId = this.GetParameter("plckPostId"); if(PostId) adParam = adParam + "&plckPostId=" + PostId;
    var IsReply = this.GetParameter("plckIsReply"); if(IsReply) adParam = adParam + "&plckIsReply=" + IsReply;
    var curPage = this.GetParameter("plckCurrentPage"); if(curPage) adParam = adParam + "&plckCurrentPage=" + curPage;
    adParam += "&plckCategoryCurrentPage=" + this.GetParameter("plckCategoryCurrentPage"); 
    return this.ForumSend("ForumCreatePost", "forumDest", "ForumMain", adParam);
}
SiteLifeProxy.prototype.ForumEditPost = function() {
    var adParam = "plckDiscussionId=" + this.GetParameter("plckDiscussionId") + "&plckRedirectUrl=" + this.EscapeValue(window.location.href);
    var PostId = this.GetParameter("plckPostId"); if(PostId) adParam = adParam + "&plckPostId=" + PostId;
    var CurrPage = this.GetParameter("plckCurrentPage"); if(!CurrPage) CurrPage="0"; adParam = adParam + "&plckCurrentPage=" + CurrPage;
    adParam += "&plckCategoryCurrentPage=" + this.GetParameter('plckCategoryCurrentPage');    
    return this.ForumSend("ForumEditPost", "forumDest", "ForumMain", adParam);
}
SiteLifeProxy.prototype.ForumEditProfile = function() {
    return this.ForumSend("ForumEditProfile", "forumDest", "ForumMain", "plckRedirectUrl=" + this.EscapeValue(window.location.href));
}
SiteLifeProxy.prototype.ToggleExpand = function(imageId, tableId) {
  if (!this.collapsedCategories) {
    var cookie = document.cookie && document.cookie.match(/forumCatState=([^;]+)/); 
    cookie = (cookie ? cookie[1].replace(/^\s+|\s+$/g, '') : []); 
    this.collapsedCategories = (cookie.length ? unescape(cookie).split('|') : []);
  }
  var tableElem = document.getElementById(tableId), imgElem = document.getElementById(imageId),
      id = tableId.split(':')[1], cats = this.collapsedCategories, expire;
  if (tableElem.style.display == 'none') {
    tableElem.style.display = 'block';
    imgElem.src = this.__baseUrl + '/Content/images/forums/minus.gif';
    for (var i = 0, length = cats.length; i < length; i++) {
      if ((cats[i] == id) || (cats[i] === ''))
        cats.splice(i,1);
    }
  }
  else {
    tableElem.style.display = 'none';
    cats.push(id); 
    imgElem.src = this.__baseUrl + '/Content/images/forums/plus.gif';
  }
  this.SetCookie('forumCatState', cats.join('|'));
}

SiteLifeProxy.prototype.ForumSearch = function(suffix) {
    var searchText = document.getElementById('plckSearchText'+suffix).value;
    searchText = FixSearchString(searchText);
    var searchArea = document.getElementById('plckSearchArea'+suffix).value;
    this.LoadForumPage("ForumSearchPaginate", "plckSearchText", searchText, "plckSearchArea", searchArea, "plckCurrentPage", "0");
    return false;
}
SiteLifeProxy.prototype.ForumSearchKeyPress = function(event, suffix) {
    if(IsEnter(event)){return this.ForumSearch(suffix);}else{return true;}
}
SiteLifeProxy.prototype.ForumSearchPaginate = function() {	
    return this.ForumSend('ForumSearchPaginate', 'forumDest', 'ForumMain', 'plckSearchArea=' + this.GetParameter('plckSearchArea') + '&plckSearchText=' + this.GetParameter('plckSearchText') + '&plckCurrentPage=' + this.GetParameter('plckCurrentPage'));
}

SiteLifeProxy.prototype.ForumSpecificForumSearchKeyPress = function(event, suffix, forumId) {
    if(IsEnter(event)){return this.ForumSpecificForumSearch(suffix, forumId);}else{return true;}
}
SiteLifeProxy.prototype.ForumSpecificForumSearch = function(suffix, forumId) {
    var searchText = document.getElementById('plckSearchText'+suffix).value;
    searchText = FixSearchString(searchText);
    this.LoadForumPage("ForumSearchSpecificForumPaginate", "plckSearchText", searchText, "plckForumId", forumId, "plckCurrentPage", "0");
    return false;
}
SiteLifeProxy.prototype.ForumSearchSpecificForumPaginate = function(title) {	
    return this.ForumSend('ForumSearchSpecificForumPaginate', 'forumDest', 'ForumMain', 'plckForumId=' + this.GetParameter('plckForumId') + '&plckSearchText=' + this.GetParameter('plckSearchText') + '&plckCurrentPage=' + this.GetParameter('plckCurrentPage'));
}

SiteLifeProxy.prototype.LoadForumPage = function(PageName, paramName, paramVal) {
    var params = new Object(); 
    params['plckForumPage'] = PageName;
    for(ii=1; ii< this.LoadForumPage.arguments.length; ii+=2) { params[this.LoadForumPage.arguments[ii]] = this.LoadForumPage.arguments[ii+1];}
    this.ReloadPage(params);
    return false;
}

SiteLifeProxy.prototype.ForumSend = function(ApiName, DestDiv, ScriptName, AddParams){
    var url = this.__baseUrl + '/Forums/' + ApiName + '?plckElementId=' + DestDiv;
    if(AddParams) url += '&' + AddParams;
    var plckPostSort = this.GetParameter('plckPostSort');
    if (plckPostSort != null){
		url += "&plckPostSort=" + plckPostSort;
	}
    this.__Send(url, ScriptName, 'widget:forums', arguments);
    return false;
}

SiteLifeProxy.prototype.ForumDiscussionEdit = function(discussionId, curView, curPage) {
    return this.ForumSend('ForumDiscussionEdit', 'forumDest', 'ForumMain', 'plckDiscussionId=' + discussionId + '&plckCurrentView=' + curView + '&plckCurrentPage=' + curPage + '&plckRedirectUrl=' + this.EscapeValue(window.location.href));
}

SiteLifeProxy.prototype.ForumPostEdit = function(discussionId, postId, curView, curPage) {
    return this.ForumSend('ForumEditPost', 'forumDest', 'ForumMain', 'plckDiscussionId=' + discussionId + '&plckPostId=' + postId + '&plckCurrentView=' + curView + '&plckCurrentPage=' + curPage + '&plckRedirectUrl=' + this.EscapeValue(window.location.href));
}

SiteLifeProxy.prototype.ForumDiscussionToggleIsSticky = function(discussionId, curView, curPage) {
	return this.ForumSend('ForumDiscussionToggleIsSticky', 'forumDest', 'ForumMain', 'plckDiscussionId=' + discussionId + '&plckCurView=' + curView + '&plckCurrentPage=' + curPage);
}

SiteLifeProxy.prototype.ForumDiscussionToggleIsClosed = function(discussionId, curView, curPage) {
    return this.ForumSend('ForumDiscussionToggleIsClosed', 'forumDest', 'ForumMain', 'plckDiscussionId=' + discussionId + '&plckCurView=' + curView + '&plckCurrentPage=' + curPage );
}

SiteLifeProxy.prototype.ForumDiscussionDelete = function(discussionId, curPage, confirmMsg) {
  if (confirm(confirmMsg) == true) {
    return this.ForumSend('ForumDiscussionDelete', 'forumDest', 'ForumMain', 'plckDiscussionId=' + discussionId + '&plckCurrentPage=' + curPage );
  }
  else {
	return false;
  }
}

SiteLifeProxy.prototype.MoveDiscussion = function(discussionKey, toForum, curView, curPage) {
    return this.ForumSend('MoveDiscussion', 'forumDest', 'ForumMain', 'discussionKey=' + discussionKey + '&toForum=' + toForum + '&plckCurView=' + curView + '&plckCurrentPage=' + curPage );
}

SiteLifeProxy.prototype.ForumEdit = function(forumId, curPage) {
    return this.ForumSend('ForumEdit', 'forumDest', 'ForumMain', 'plckForumId=' + forumId + '&plckCurrentPage=' + curPage  );
}

SiteLifeProxy.prototype.ForumToggleIsClosed = function(forumId, curPage) {
    return this.ForumSend('ForumToggleIsClosed', 'forumDest', 'ForumMain', 'plckForumId=' + forumId + '&plckCurrentPage=' + curPage  );
}

SiteLifeProxy.prototype.ForumDelete = function(forumId, confirmMsg) {
  if (confirm(confirmMsg) == true) {
    return this.ForumSend('ForumDelete', 'forumDest', 'ForumMain', 'plckForumId=' + forumId );
  }
  else {
	return false;
  }
}

SiteLifeProxy.prototype.ForumPostDelete = function(postId, curPage, confirmMsg) {
  if (confirm(confirmMsg) == true) {
    return this.ForumSend('ForumPostDelete', 'forumDest', 'ForumMain', 'plckPostId=' + postId + '&plckCurPage=' + curPage);
  }
  else {
	return false;
  }
}

SiteLifeProxy.prototype.ForumBlockUser = function(postId, userId, value, curPage) {
    return this.ForumSend('ForumBlockUser', 'forumDest', 'ForumMain', 'plckPostId=' + postId + '&plckUserId=' + userId + '&plckValue=' + value + '&plckCurPage=' + curPage);
}

SiteLifeProxy.prototype.ForumMyDiscussionsPaginate = function(pageNum) {
    return this.ForumSend('ForumMyDiscussionsPaginate', 'ForumMyDiscussionsDiv', 'ForumMain', 'plckMyDiscussionsPage=' + pageNum);
}

SiteLifeProxy.prototype.ForumImage = function() {
    var adParam = "plckRedirectUrl=" + this.GetParameter("plckRedirectUrl");
    var pId = this.GetParameter("plckPhotoId"); adParam += "&plckPhotoId=" + pId;
    return this.ForumSend('ForumImage', 'forumDest', 'ForumMain', adParam);
}

SiteLifeProxy.prototype.BaseAdParam = function () {
    var adParam = "plckRedirectUrl=" + this.EscapeValue(window.location.href);
    var fId = this.GetParameter("plckForumId"); adParam += "&plckForumId=" + fId;
    var curView = this.GetParameter("plckCurrentView"); if(curView) adParam += "&plckCurrentView=" + curView;
    var curPage = this.GetParameter("plckCurrentPage"); if(curPage) adParam += "&plckCurrentPage=" + curPage;
    return adParam;
}

SiteLifeProxy.prototype.ForumJoinGroup = function() {
    var adParam = this.BaseAdParam();
    var dId = this.GetParameter("plckDiscussionId"); if(dId) adParam += "&plckDiscussionId=" + dId;
    return this.ForumSend("ForumJoinGroup", "forumDest", "ForumMain", adParam);
}

SiteLifeProxy.prototype.ForumLeaveGroup = function() {
    var adParam = this.BaseAdParam();
    var dId = this.GetParameter("plckDiscussionId"); if(dId) adParam += "&plckDiscussionId=" + dId;
    return this.ForumSend("ForumLeaveGroup", "forumDest", "ForumMain", adParam);
}

SiteLifeProxy.prototype.ForumGroupMemberList = function() {
    var adParam = this.BaseAdParam();
    return this.ForumSend("ForumGroupMemberList", "forumDest", "ForumMain", adParam);
}

SiteLifeProxy.prototype.ForumInviteUser = function() {
    var adParam = this.BaseAdParam();
    return this.ForumSend("ForumInviteUser", "forumDest", "ForumMain", adParam);
}

SiteLifeProxy.prototype.ForumGroupConfirm = function() {
    var adParam = this.BaseAdParam();
    var confirmType = this.GetParameter("plckConfirmType"); if (confirmType) adParam += "&plckConfirmType=" + confirmType;
    return this.ForumSend("ForumGroupConfirm", "forumDest", "ForumMain", adParam);
}

SiteLifeProxy.prototype.ForumSendInviteToUser = function(username, email) {
    var adParam = this.BaseAdParam();
    var username = this.GetParameter("plckUsername"); if (username) adParam += "&plckUsername=" + username;
    var email = this.GetParameter("plckUserEmail"); if (email) adParam += "&plckUserEmail" + email;
    return this.ForumSend("ForumSendInviteToUser", "forumDest", "ForumMain", adParam);
}

SiteLifeProxy.prototype.ForumAddEnemy = function(enemyKey) {
    var adParam = this.BaseAdParam();
    adParam += "&enemyKey=" + enemyKey;
    var dId = this.GetParameter("plckDiscussionId"); if(dId) adParam += "&plckDiscussionId=" + dId;
    return this.ForumSend("ForumAddEnemy", "forumDest", "ForumMain", adParam);
}

SiteLifeProxy.prototype.ForumRemoveEnemy = function(enemyKey) {
    var adParam = this.BaseAdParam();
    adParam += "&enemyKey=" + enemyKey;
    var dId = this.GetParameter("plckDiscussionId"); if(dId) adParam += "&plckDiscussionId=" + dId;
    return this.ForumSend("ForumRemoveEnemy", "forumDest", "ForumMain", adParam);
}

function slGetElementsByClassName(classname, node)  {
    if(!node) node = document.getElementsByTagName("body")[0];
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}

	function hideAllPostsFromUser(userKey){
	  var posts = slGetElementsByClassName("postVisibilityContainer_"+userKey, document);
	  var hiddenMessages = slGetElementsByClassName("postHiddenMessage_"+userKey, document);
	  
	  for(i=0; i < posts.length; i++){
	    posts[i].style.display = "none";
	    hiddenMessages[i].style.display = "block";
	  }
	  
	  gSiteLife.ForumAddEnemy(userKey);
	}
	
	function showAllPostsFromUser(userKey){
	  var posts = slGetElementsByClassName("postVisibilityContainer_"+userKey, document);
	  var hiddenMessages = slGetElementsByClassName("postHiddenMessage_"+userKey, document);
	  	  
	  for(i=0; i < posts.length; i++){
	    posts[i].style.display = "block";
	    hiddenMessages[i].style.display = "none";
	  }
	  
	  gSiteLife.ForumRemoveEnemy(userKey);
	}
	
SiteLifeProxy.prototype.ForumChangeSort = function(sortParamName, sortDirection) {
		var currentUrl = document.location.href;
		var newUrl;
		// replace the sort param in the url, if found
		var re = new RegExp("([?|&])" + sortParamName + "=.*?(&|$)","i");
		if (currentUrl.match(re)) {
			newUrl = currentUrl.replace(re, '$1' + sortParamName + "=" + sortDirection + '$2');
		}
		else {
			if(currentUrl.indexOf('?') >= 0){
				newUrl = currentUrl + '&' + sortParamName + "=" + sortDirection;
			}
			else{
				newUrl = currentUrl + '?' + sortParamName + "=" + sortDirection;
			}
		}
		document.location.href = newUrl;
}

SiteLifeProxy.prototype.ForumSetLastRead = function(discussionKey, postKey) {
    var adParam = this.BaseAdParam();
    adParam += "&discussionKey=" + discussionKey;
    if(postKey){
		adParam += "&postKey=" + postKey;
	}
    var ret = this.ForumSend("ForumSetLastRead", "forumDest", "ForumMain", adParam);
    
    if(!postKey){
		location.reload();
    }
    
    return ret;
} 

SiteLifeProxy.prototype.ForumDiscussionSubscribe = function(discussionKey, targetDiv) {
    var url = this.__baseUrl + '/Forums/ForumDiscussionSubscribe?' + 'plckDiscussionId=' + discussionKey + '&plckElementId=' + targetDiv;
    this.__Send(url, "ForumDiscussionSubscribe");
    return false;
}

SiteLifeProxy.prototype.ForumDiscussionUnSubscribe = function(discussionKey, targetDiv) {
    var url = this.__baseUrl + '/Forums/ForumDiscussionUnSubscribe?' + 'plckDiscussionId=' + discussionKey + '&plckElementId=' + targetDiv;
    this.__Send(url, "ForumDiscussionUnSubscribe");
    return false;
}


SiteLifeProxy.prototype.Recommend = function(keyType, targetKey, parentUrl) {
    keyType = keyType || "ExternalResource";
    targetKey = targetKey || gSiteLife.__StripAnchorFromUrl(window.location.href);
    parentUrl = parentUrl || window.location.href;
    targetKey = targetKey;
    var divId = "Recommend" + new Date().getTime();
    this.WriteDiv(divId, "Recommend");
    var url = this.__baseUrl + 
        '/Recommend/Recommend?plckElementId=' + divId + 
        '&plckTargetKey=' + gSiteLife.EscapeValue(targetKey) + 
        '&plckTargetKeyType=' + keyType +
        '&plckTargetUrl=' + gSiteLife.EscapeValue(parentUrl);
    this.__Send(url);
    return false;   
}

SiteLifeProxy.prototype.PostRecommendation = function(keyType, targetKey, recommendDiv, parentTitle, parentUrl) {
    parentUrl = parentUrl || window.location.href;
    var url = this.__baseUrl + 
        '/Recommend/PostRecommendation?plckElementId=' + recommendDiv + 
        '&plckTargetKey=' + gSiteLife.EscapeValue(targetKey) + 
        '&plckTargetKeyType=' + keyType +
        '&plckTargetUrl=' + gSiteLife.EscapeValue(parentUrl);
    if(parentTitle) url += '&plckParentTitle=' + gSiteLife.EscapeValue(parentTitle);
    
    this.__Send(url);
    return false;
}


SiteLifeProxy.prototype.RateItem = function (itemId, itemType, rating, targetDiv, parentTitle, parentUrl) {
    var url = this.__baseUrl + '/Rating/Rate?plckElementId=' + targetDiv + 
        '&plckTargetKey=' + gSiteLife.EscapeValue(itemId) + 
        '&plckTargetKeyType=' + itemType + 
        '&plckRating=' + rating +
        '&plckTargetUrl=' + gSiteLife.EscapeValue(parentUrl);
        if(parentTitle) url += '&plckParentTitle=' + parentTitle;
    this.__Send(url);
    return false;
}

SiteLifeProxy.prototype.Rating = function(itemType, itemId, parentUrl) {
    itemType = itemType || "ExternalResource";
    itemId = itemId || gSiteLife.__StripAnchorFromUrl(window.location.href);
    parentUrl = parentUrl || window.location.href;
    var divId = itemId + "_plckRateDiv_" + new Date().getTime() + Math.floor(Math.random()*1000);
    this.WriteDiv(divId, "Rating");
    var url = this.__baseUrl + '/Rating/GetRating?plckElementId=' + divId +
        '&plckTargetKey=' + gSiteLife.EscapeValue(itemId) + 
        '&plckTargetKeyType=' + itemType +
        '&plckTargetUrl=' + gSiteLife.EscapeValue(parentUrl);
    this.__Send(url);
    return false;   
}

SiteLifeProxy.prototype.RatingClickStar = function (index, targetKey, targetKeyType, targetDiv, parentTitle, parentUrl) {
    gSiteLife.RateItem(targetKey, targetKeyType, index, targetDiv, parentTitle, parentUrl);
    
}

SiteLifeProxy.prototype.RatingFillStar = function(index, targetKey, lbl) {
    var stars = document.getElementsByName(targetKey+"Stars");
    var label = document.getElementById(targetKey + "Rating-label");
    var selectedIndex = parseInt(document.getElementById(targetKey+"Rating-value").value);
    
    if (index < 0 && selectedIndex >= 0) index = selectedIndex;
    for(i=1; i <= stars.length; i++) {
        if (index > 0 && i <= index) {
            stars[i-1].src = this.__baseUrl + "/Content/images/icons/fullstar.gif";
        }else {
            stars[i-1].src = this.__baseUrl + "/Content/images/icons/emptystar.gif";
        }
    }
    label.innerHTML = lbl;
}

SiteLifeProxy.prototype.Review = function(parentKeyType, parentKey, reviewedTitle, reviewCategory, pageSize, sort, currentPage) {
    
    var divId = "Reviews_Container";
    this.WriteDiv(divId);
    return this.GetReviews(parentKeyType, parentKey, reviewedTitle, reviewCategory, pageSize, sort, currentPage);
}

SiteLifeProxy.prototype.ReviewClickStar = function (index, targetKey) {
    document.getElementById(targetKey+"Rating-value").value = index;
}

SiteLifeProxy.prototype.GetReviews = function(parentKeyType, parentKey, reviewedTitle, reviewCategory, pageSize, sort, currentPage) {
    parentKeyType = parentKeyType || "ExternalResource";
    parentKey = gSiteLife.EscapeValue(parentKey) || gSiteLife.EscapeValue(gSiteLife.__StripAnchorFromUrl(window.location.href));
    reviewedTitle = gSiteLife.EscapeValue(reviewedTitle) || gSiteLife.EscapeValue(document.title);
    reviewCategory = reviewCategory || "Uncategorized";
    pageSize = pageSize || 10;
    sort = sort || "TimeStampAscending";
    currentPage = currentPage || 0;
    var url = this.__baseUrl + '/Review/Reviews?plckElementId=Reviews_Container' +
        '&plckTargetKey=' + parentKey + 
        '&plckTargetKeyType=' + parentKeyType +
        '&plckReviewedTitle=' + reviewedTitle +
        '&plckReviewCategory=' + reviewCategory +
        '&plckSort=' + sort + 
        '&plckParentUrl=' + gSiteLife.EscapeValue(gSiteLife.__StripAnchorFromUrl(window.location.href)) + 
        '&plckParentTitle=' + gSiteLife.EscapeValue(document.title) +
        '&plckCurrentPage=' + currentPage +
        '&plckPageSize=' + pageSize;
    this.__Send(url);
    return false;   
}

SiteLifeProxy.prototype.SummaryArticlesMostCommented = function(count) {
 return this.SummaryPanel("SummaryArticlesMostCommented", count); 
} 
SiteLifeProxy.prototype.SummaryArticlesMostRecommended = function(count) {
 return this.SummaryPanel("SummaryArticlesMostRecommended", count); 
} 
SiteLifeProxy.prototype.SummaryPhotosRecentPhotosByTag = function(count, tagFilter, filterBySiteOfOrigin) {
 return this.SummaryPanel("SummaryPhotosRecentPhotosByTag", count, tagFilter, filterBySiteOfOrigin); 
} 
SiteLifeProxy.prototype.SummaryPhotosRecentUserPhotos = function(count, tagFilter, filterBySiteOfOrigin) {
 return this.SummaryPanel("SummaryPhotosRecentUserPhotos", count, tagFilter, filterBySiteOfOrigin);
} 
SiteLifeProxy.prototype.SummaryPhotosRecentPhotos = function(count, tagFilter, filterBySiteOfOrigin) {
 return this.SummaryPanel("SummaryPhotosRecentPhotos", count, tagFilter, filterBySiteOfOrigin); 
} 
SiteLifeProxy.prototype.SummaryPhotosMostRecommendedPhotos = function(count, filterBySiteOfOrigin) {
 return this.SummaryPanel("SummaryPhotosMostRecommendedPhotos", count, "", filterBySiteOfOrigin); 
} 
SiteLifeProxy.prototype.SummaryPhotosMostRecommendedUserPhotos = function(count, filterBySiteOfOrigin) {
 return this.SummaryPanel("SummaryPhotosMostRecommendedUserPhotos", count, "", filterBySiteOfOrigin); 
} 
SiteLifeProxy.prototype.SummaryPhotosMostRecommendedGalleries = function(count) {
 return this.SummaryPanel("SummaryPhotosMostRecommendedGalleries", count); 
} 
SiteLifeProxy.prototype.SummaryForumsRecentDiscussions = function(count, filterBySiteOfOrigin, parentIds) {
    var divId= "Summary_Container" + this.SID;
    if(this.numSummaryWidgets){ divId += this.numSummaryWidgets++; } else { this.numSummaryWidgets = 1; }
    this.WriteDiv(divId, divId);
    var methodName = "SummaryForumsRecentDiscussions";
    var tagFilter = "";
    return this.SummarySend(methodName, divId, divId + "Script", "plckCount", count, "plckTagFilter", tagFilter, "plckFilterBySiteOfOrigin", filterBySiteOfOrigin, "plckParentIds", parentIds);
} 
SiteLifeProxy.prototype.SummaryBlogsRecent = function(count, tagFilter) {
    return this.SummaryPanel("SummaryBlogsRecent", count, tagFilter);
}
SiteLifeProxy.prototype.SummaryBlogsRecentPostsByTag = function(count, tagFilter, filterBySiteOfOrigin) {
 return this.SummaryPanel("SummaryBlogsRecentPostsByTag", count, tagFilter, filterBySiteOfOrigin); 
} 
SiteLifeProxy.prototype.SummaryBlogsRecentPosts = function(count, tagFilter, filterBySiteOfOrigin) {
 return this.SummaryPanel("SummaryBlogsRecentPosts", count, tagFilter, filterBySiteOfOrigin); 
} 
SiteLifeProxy.prototype.SummaryBlogsMostRecommendedPosts = function(count, tagFilter, filterBySiteOfOrigin) {
    return this.SummaryPanel("SummaryBlogsMostRecommendedPosts", count, tagFilter, filterBySiteOfOrigin);
}
SiteLifeProxy.prototype.SummaryPersonaProfileRecent = function(count) {
    return this.SummaryPanel("SummaryPersonaProfileRecent", count);
}
SiteLifeProxy.prototype.SummaryPanel = function(methodName, count, tagFilter, filterBySiteOfOrigin) {
    var divId= "Summary_Container" + this.SID;
    if(this.numSummaryWidgets){ divId += this.numSummaryWidgets++; } else { this.numSummaryWidgets = 1; }
    this.WriteDiv(divId, divId);
    return this.SummarySend(methodName, divId, divId + "Script", "plckCount", count, "plckTagFilter", tagFilter, "plckFilterBySiteOfOrigin", filterBySiteOfOrigin);
}
SiteLifeProxy.prototype.SummarySend = function(ApiName, DestDiv, ScriptName) {
    var url = this.__baseUrl + '/Summary/' + ApiName + '?plckElementId=' + DestDiv;
    for(ii=3; ii< this.SummarySend.arguments.length; ii+=2) { if(this.SummarySend.arguments[ii+1]) { url += "&" + this.SummarySend.arguments[ii] + "=" + this.SummarySend.arguments[ii+1];} }
    this.__Send(url, ScriptName);
    return false;
}




var gSiteLife = new SiteLifeProxy("http://pluck.ledger-enquirer.com/ver1.0");
gSiteLife.apiKey = "${APIKey}";
gSiteLife.SID = "pluck.ledger-enquirer.com";



    // We need to return true here as our default behavior allowing normal link navigation
    gSiteLife.AddEventHandler('ExternalResourceLink', function() {return true;});

if(gSiteLife.GetParameter('plckPersonaPage') && gSiteLife.GetParameter('plckPersonaPage').indexOf('PersonaBlog') == 0) {
document.write("<link href=" + "'http://pluck.ledger-enquirer.com/ver1.0/blog/BlogRss?plckBlogId=" + gSiteLife.GetParameter('insiteUserId') + "' title='" + gSiteLife.GetParameter('insiteUserId') + " Blog'" + "rel='alternate' type='application/rss+xml' />"); }
var numUploads = 1;
var maxUploads = 4;


function VerifyTOS() {
    if(!document.getElementById("plckTermsOfPhotoService").checked) {
        alert("Please agree to the terms of service before submitting.");
        return false;
    }
    return true;
}

// use to generate more photo submission divs
function AddAnotherPhoto(parentDivID,uploadButtonID, parentFrame){
    divNode = document.createElement('div');
    divNode.id = 'PhotoUpload' + ++numUploads;
    divNode.innerHTML = "<input type='file' name='image" + numUploads + "' value='Get' size=40/><br/><br/>"

    document.getElementById(parentDivID).appendChild(divNode);
    if(numUploads > maxUploads) document.getElementById(uploadButtonID).style.display = 'none';
    setTimeout(function(){autofitIframe(parentFrame, true);}, 100);
    return false;
}


// Returns the value of the radio button that is set in a group of buttons.
function getCheckedValue(radioObj) {
	var radioLength = radioObj.length;
	if(radioLength == undefined) {
		if(radioObj.checked) {
			return radioObj.value;
		}
		else {
			return "";
		}
	}
	for(var i = 0; i < radioLength; i++) {
		if(radioObj[i].checked) {
			return radioObj[i].value;
		}
	}
	return "";
}

// this trim was suggested by Tobias Hinnerup
String.prototype.trim = function() {
    return(this.replace(/^\s+/,'').replace(/\s+$/,''));
}

function IsEnter(e)  {
var kc = e.which;
if(kc == null) kc = e.keyCode;
if (e && kc == 13) return true;
return false;
}
function TrimEnd(ct, c) {
    while((ct.length > 0) && (ct.lastIndexOf(c) == (ct.length - 1))){
        if(ct.length > 1 ) {
            ct = ct.substring(0, ct.length - 1);
        }else{ 
            return "";
        }
    }
    return ct;
}
function FixSearchString(str) {
    var ct = str.replace(/[\%\&\/\<\>\\\|]+/g,"");
    ct = ct.replace(/[\.]{2,}/g, ".");
        
    ct = TrimEnd(ct,".");
    if( ct == "" ) return "";
    ct = TrimEnd(ct," ");
    if( ct == "") return "";

    ct = escape(ct);
    // JavaScript's built-in escape() skips plus signs, but we need them for Lucene
    ct = ct.replace(/\+/g, "%2B");
    return ct;
}

var nextGroupID = 1;

function autofitIframe(id, heightOnly){
    if(document.getElementById) {
        if(this.document.body.scrollHeight == 0 || ( !heightOnly && this.document.body.scrollWidth == 0)) {
            //Onload fired, DOM assembled, but scrollHeight/Width is zero. This should not be... Go to
            //sleep and try again
            setTimeout(function(){autofitIframe(id, heightOnly);}, 150);
            return;
        }
        window.parent.document.getElementById(id).style.height=this.document.body.scrollHeight+"px";
        if(!heightOnly)window.parent.document.getElementById(id).style.width=this.document.body.scrollWidth+"px";
    }
}

//Determines if the string being tested is a Url.
function isUrl(s) {
	var regexp = /(ftp|https?|file):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/
	return regexp.test(s);
}

function ValidateLogin() {
    function $(id) { return document.getElementById(id) };
    if($("plckUserName").value == '' && $("plckPassword").value == '') {
        alert("You must provide a UserName and Password");
        return false;
    }
    if($("plckUserName").value == '') {
        alert("You must provide a UserName");
        return false;
    }
    if($("plckPassword").value == '') {
        alert("You must provide a Password");
        return false;
    }
}   

function onSearchSubmit(qroupID) {
    if($(qroupID  + "_Search").value == '') {
        alert("You must provide some query text");
        return false;
    }    
}

function LimitLength(control, limitToLength) {
  var str = control.value;
  if(! str || str.length == 0) return false;
  
  var matches = str.match(/\r|\n/g);
  if(! matches) return false;
  
  var offSet = matches.length;
  if (str.length > (limitToLength + offSet)) {
    control.value = str.substring(0, limitToLength + offSet);
  }
  return false;
} 
/* this document is for visual dhtml features */
function mouseX(evt) {
    if (evt.pageX) return evt.pageX;
    else if (evt.clientX)
       return evt.clientX + (document.documentElement.scrollLeft ?
       document.documentElement.scrollLeft :
       document.body.scrollLeft);
    else return null;
}
function mouseY(evt) {
    if (evt.pageY) return evt.pageY;
    else if (evt.clientY)
       return evt.clientY + (document.documentElement.scrollTop ?
       document.documentElement.scrollTop :
       document.body.scrollTop);
    else return null;
}
function HideDiv(id){
    document.getElementById(id).style.display = "none";
}

function ShowDivAtMouse(evt, id) {
    posx = mouseX(evt) - 170;    
    posy = mouseY(evt);
    //normalize to make sure we at least appear on the screen
    if(posx < 0) posx = 10;
    if(posy < 0) posy = 10;
    
    document.getElementById(id).style.left = posx + "px";
	document.getElementById(id).style.top = posy + "px";
	document.getElementById(id).style.display = "block";
}
function ShowReportAbuse(evt, url, command) {
    var doc = document;
    doc.getElementById("ReportAbuse_Url").value = url; 
    doc.getElementById("ReportAbuse_Command").value = command;
    doc.getElementById("ReportAbuse_CommentText").value = "";
    doc.getElementById("ReportAbuse_Reason").selectedIndex = 0;
    ShowDivAtMouse(evt, "ReportAbuse_Menu");
    doc.getElementById('ReportAbuse_CommentText').focus();
}
function ReportAbuse() {
    var url = document.getElementById("ReportAbuse_Url").value; 
    var command = document.getElementById("ReportAbuse_Command").value;
    var text = document.getElementById("ReportAbuse_CommentText").value;
    var reason = document.getElementById("ReportAbuse_Reason").value;
    document.getElementById("ReportAbuse_Menu").style.display='none';
    var sendUrl = command+'&plckReason='+gSiteLife.EscapeValue(reason)+'&plckURL=' + gSiteLife.EscapeValue(url)
    if(text) sendUrl += "&plckAbuseDetail=" + gSiteLife.EscapeValue(text);
    gSiteLife.__Send(sendUrl);
}

function SiteLifeShowHide(id1, id2){
    document.getElementById(id1).style.display = "none";
    document.getElementById(id2).style.display = "block";
    return false;
}

function DebugShowInnerHTML(id, url) {
    var el = document.getElementById(id);
    var floatDiv = document.createElement("div");
      
    floatDiv.style.position = "absolute";    
    floatDiv.style.zIndex='1000';
    floatDiv.innerHTML = "<span style='background-color:red; color:white; cursor:pointer;' onclick='this.parentNode.parentNode.removeChild(this.parentNode);'>[close]</span>";    
    floatDiv.innerHTML += "<div style='background-color:black; color:white;'>" + url + "</div><textarea rows='20' cols='80'>" + el.childNodes[0].childNodes[1].innerHTML + "</textarea>";
    el.insertBefore(floatDiv, el.childNodes[0]);
}


function ToggleState() {
    function $(id) { return document.getElementById(id) };
    var radio1 = $("plckCommentApprovalEveryOne");
    var radio2 = $("plckCommentApprovalNoBody");
    var table = $("commentSettings"); 
    if(radio1.disabled  == true) {
        radio1.disabled  = false;
        radio2.disabled  = false;
        table.className = "";
    }
    else {
        radio1.disabled  = true;
        radio2.disabled  = true;
        table.className = "BlogSettings_Disabled";
    }
}

function getElementsByClassName(classname, node)  {
    if(!node) node = document.getElementsByTagName("body")[0];
    var a = [];
    var re = new RegExp('\\b' + classname + '\\b');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}


/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 2.6.0
*/
if(typeof YAHOO=="undefined"||!YAHOO){var YAHOO={};}YAHOO.namespace=function(){var A=arguments,E=null,C,B,D;for(C=0;C<A.length;C=C+1){D=A[C].split(".");E=YAHOO;for(B=(D[0]=="YAHOO")?1:0;B<D.length;B=B+1){E[D[B]]=E[D[B]]||{};E=E[D[B]];}}return E;};YAHOO.log=function(D,A,C){var B=YAHOO.widget.Logger;if(B&&B.log){return B.log(D,A,C);}else{return false;}};YAHOO.register=function(A,E,D){var I=YAHOO.env.modules;if(!I[A]){I[A]={versions:[],builds:[]};}var B=I[A],H=D.version,G=D.build,F=YAHOO.env.listeners;B.name=A;B.version=H;B.build=G;B.versions.push(H);B.builds.push(G);B.mainClass=E;for(var C=0;C<F.length;C=C+1){F[C](B);}if(E){E.VERSION=H;E.BUILD=G;}else{YAHOO.log("mainClass is undefined for module "+A,"warn");}};YAHOO.env=YAHOO.env||{modules:[],listeners:[]};YAHOO.env.getVersion=function(A){return YAHOO.env.modules[A]||null;};YAHOO.env.ua=function(){var C={ie:0,opera:0,gecko:0,webkit:0,mobile:null,air:0};var B=navigator.userAgent,A;if((/KHTML/).test(B)){C.webkit=1;}A=B.match(/AppleWebKit\/([^\s]*)/);if(A&&A[1]){C.webkit=parseFloat(A[1]);if(/ Mobile\//.test(B)){C.mobile="Apple";}else{A=B.match(/NokiaN[^\/]*/);if(A){C.mobile=A[0];}}A=B.match(/AdobeAIR\/([^\s]*)/);if(A){C.air=A[0];}}if(!C.webkit){A=B.match(/Opera[\s\/]([^\s]*)/);if(A&&A[1]){C.opera=parseFloat(A[1]);A=B.match(/Opera Mini[^;]*/);if(A){C.mobile=A[0];}}else{A=B.match(/MSIE\s([^;]*)/);if(A&&A[1]){C.ie=parseFloat(A[1]);}else{A=B.match(/Gecko\/([^\s]*)/);if(A){C.gecko=1;A=B.match(/rv:([^\s\)]*)/);if(A&&A[1]){C.gecko=parseFloat(A[1]);}}}}}return C;}();(function(){YAHOO.namespace("util","widget","example");if("undefined"!==typeof YAHOO_config){var B=YAHOO_config.listener,A=YAHOO.env.listeners,D=true,C;if(B){for(C=0;C<A.length;C=C+1){if(A[C]==B){D=false;break;}}if(D){A.push(B);}}}})();YAHOO.lang=YAHOO.lang||{};(function(){var A=YAHOO.lang,C=["toString","valueOf"],B={isArray:function(D){if(D){return A.isNumber(D.length)&&A.isFunction(D.splice);}return false;},isBoolean:function(D){return typeof D==="boolean";},isFunction:function(D){return typeof D==="function";},isNull:function(D){return D===null;},isNumber:function(D){return typeof D==="number"&&isFinite(D);},isObject:function(D){return(D&&(typeof D==="object"||A.isFunction(D)))||false;},isString:function(D){return typeof D==="string";},isUndefined:function(D){return typeof D==="undefined";},_IEEnumFix:(YAHOO.env.ua.ie)?function(F,E){for(var D=0;D<C.length;D=D+1){var H=C[D],G=E[H];if(A.isFunction(G)&&G!=Object.prototype[H]){F[H]=G;}}}:function(){},extend:function(H,I,G){if(!I||!H){throw new Error("extend failed, please check that "+"all dependencies are included.");}var E=function(){};E.prototype=I.prototype;H.prototype=new E();H.prototype.constructor=H;H.superclass=I.prototype;if(I.prototype.constructor==Object.prototype.constructor){I.prototype.constructor=I;}if(G){for(var D in G){if(A.hasOwnProperty(G,D)){H.prototype[D]=G[D];}}A._IEEnumFix(H.prototype,G);}},augmentObject:function(H,G){if(!G||!H){throw new Error("Absorb failed, verify dependencies.");}var D=arguments,F,I,E=D[2];if(E&&E!==true){for(F=2;F<D.length;F=F+1){H[D[F]]=G[D[F]];}}else{for(I in G){if(E||!(I in H)){H[I]=G[I];}}A._IEEnumFix(H,G);}},augmentProto:function(G,F){if(!F||!G){throw new Error("Augment failed, verify dependencies.");}var D=[G.prototype,F.prototype];for(var E=2;E<arguments.length;E=E+1){D.push(arguments[E]);}A.augmentObject.apply(this,D);},dump:function(D,I){var F,H,K=[],L="{...}",E="f(){...}",J=", ",G=" => ";if(!A.isObject(D)){return D+"";}else{if(D instanceof Date||("nodeType" in D&&"tagName" in D)){return D;}else{if(A.isFunction(D)){return E;}}}I=(A.isNumber(I))?I:3;if(A.isArray(D)){K.push("[");for(F=0,H=D.length;F<H;F=F+1){if(A.isObject(D[F])){K.push((I>0)?A.dump(D[F],I-1):L);}else{K.push(D[F]);}K.push(J);}if(K.length>1){K.pop();}K.push("]");}else{K.push("{");for(F in D){if(A.hasOwnProperty(D,F)){K.push(F+G);if(A.isObject(D[F])){K.push((I>0)?A.dump(D[F],I-1):L);}else{K.push(D[F]);}K.push(J);}}if(K.length>1){K.pop();}K.push("}");}return K.join("");},substitute:function(S,E,L){var I,H,G,O,P,R,N=[],F,J="dump",M=" ",D="{",Q="}";for(;;){I=S.lastIndexOf(D);if(I<0){break;}H=S.indexOf(Q,I);if(I+1>=H){break;}F=S.substring(I+1,H);O=F;R=null;G=O.indexOf(M);if(G>-1){R=O.substring(G+1);O=O.substring(0,G);}P=E[O];if(L){P=L(O,P,R);}if(A.isObject(P)){if(A.isArray(P)){P=A.dump(P,parseInt(R,10));}else{R=R||"";var K=R.indexOf(J);if(K>-1){R=R.substring(4);}if(P.toString===Object.prototype.toString||K>-1){P=A.dump(P,parseInt(R,10));}else{P=P.toString();}}}else{if(!A.isString(P)&&!A.isNumber(P)){P="~-"+N.length+"-~";N[N.length]=F;}}S=S.substring(0,I)+P+S.substring(H+1);}for(I=N.length-1;I>=0;I=I-1){S=S.replace(new RegExp("~-"+I+"-~"),"{"+N[I]+"}","g");}return S;},trim:function(D){try{return D.replace(/^\s+|\s+$/g,"");}catch(E){return D;}},merge:function(){var G={},E=arguments;for(var F=0,D=E.length;F<D;F=F+1){A.augmentObject(G,E[F],true);}return G;},later:function(K,E,L,G,H){K=K||0;E=E||{};var F=L,J=G,I,D;if(A.isString(L)){F=E[L];}if(!F){throw new TypeError("method undefined");}if(!A.isArray(J)){J=[G];}I=function(){F.apply(E,J);};D=(H)?setInterval(I,K):setTimeout(I,K);return{interval:H,cancel:function(){if(this.interval){clearInterval(D);}else{clearTimeout(D);}}};},isValue:function(D){return(A.isObject(D)||A.isString(D)||A.isNumber(D)||A.isBoolean(D));}};A.hasOwnProperty=(Object.prototype.hasOwnProperty)?function(D,E){return D&&D.hasOwnProperty(E);}:function(D,E){return !A.isUndefined(D[E])&&D.constructor.prototype[E]!==D[E];};B.augmentObject(A,B,true);YAHOO.util.Lang=A;A.augment=A.augmentProto;YAHOO.augment=A.augmentProto;YAHOO.extend=A.extend;})();YAHOO.register("yahoo",YAHOO,{version:"2.6.0",build:"1321"});/*
Copyright (c) 2008, Yahoo! Inc. All rights reserved.
Code licensed under the BSD License:
http://developer.yahoo.net/yui/license.txt
version: 2.6.0
*/
YAHOO.lang.JSON=(function(){var l=YAHOO.lang,_UNICODE_EXCEPTIONS=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,_ESCAPES=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,_VALUES=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,_BRACKETS=/(?:^|:|,)(?:\s*\[)+/g,_INVALID=/^[\],:{}\s]*$/,_SPECIAL_CHARS=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,_CHARS={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};function _revive(data,reviver){var walk=function(o,key){var k,v,value=o[key];if(value&&typeof value==="object"){for(k in value){if(l.hasOwnProperty(value,k)){v=walk(value,k);if(v===undefined){delete value[k];}else{value[k]=v;}}}}return reviver.call(o,key,value);};return typeof reviver==="function"?walk({"":data},""):data;}function _char(c){if(!_CHARS[c]){_CHARS[c]="\\u"+("0000"+(+(c.charCodeAt(0))).toString(16)).slice(-4);}return _CHARS[c];}function _prepare(s){return s.replace(_UNICODE_EXCEPTIONS,_char);}function _isValid(str){return l.isString(str)&&_INVALID.test(str.replace(_ESCAPES,"@").replace(_VALUES,"]").replace(_BRACKETS,""));}function _string(s){return'"'+s.replace(_SPECIAL_CHARS,_char)+'"';}function _stringify(h,key,d,w,pstack){var o=typeof w==="function"?w.call(h,key,h[key]):h[key],i,len,j,k,v,isArray,a;if(o instanceof Date){o=l.JSON.dateToString(o);}else{if(o instanceof String||o instanceof Boolean||o instanceof Number){o=o.valueOf();}}switch(typeof o){case"string":return _string(o);case"number":return isFinite(o)?String(o):"null";case"boolean":return String(o);case"object":if(o===null){return"null";}for(i=pstack.length-1;i>=0;--i){if(pstack[i]===o){return"null";}}pstack[pstack.length]=o;a=[];isArray=l.isArray(o);if(d>0){if(isArray){for(i=o.length-1;i>=0;--i){a[i]=_stringify(o,i,d-1,w,pstack)||"null";}}else{j=0;if(l.isArray(w)){for(i=0,len=w.length;i<len;++i){k=w[i];v=_stringify(o,k,d-1,w,pstack);if(v){a[j++]=_string(k)+":"+v;}}}else{for(k in o){if(typeof k==="string"&&l.hasOwnProperty(o,k)){v=_stringify(o,k,d-1,w,pstack);if(v){a[j++]=_string(k)+":"+v;}}}}a.sort();}}pstack.pop();return isArray?"["+a.join(",")+"]":"{"+a.join(",")+"}";}return undefined;}return{isValid:function(s){return _isValid(_prepare(s));},parse:function(s,reviver){s=_prepare(s);if(_isValid(s)){return _revive(eval("("+s+")"),reviver);}throw new SyntaxError("parseJSON");},stringify:function(o,w,d){if(o!==undefined){if(l.isArray(w)){w=(function(a){var uniq=[],map={},v,i,j,len;for(i=0,j=0,len=a.length;i<len;++i){v=a[i];if(typeof v==="string"&&map[v]===undefined){uniq[(map[v]=j++)]=v;}}return uniq;})(w);}d=d>=0?d:1/0;return _stringify({"":o},"",d,w,[]);}return undefined;},dateToString:function(d){function _zeroPad(v){return v<10?"0"+v:v;}return d.getUTCFullYear()+"-"+_zeroPad(d.getUTCMonth()+1)+"-"+_zeroPad(d.getUTCDate())+"T"+_zeroPad(d.getUTCHours())+":"+_zeroPad(d.getUTCMinutes())+":"+_zeroPad(d.getUTCSeconds())+"Z";},stringToDate:function(str){if(/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/.test(str)){var d=new Date();d.setUTCFullYear(RegExp.$1,(RegExp.$2|0)-1,RegExp.$3);d.setUTCHours(RegExp.$4,RegExp.$5,RegExp.$6);return d;}return str;}};})();YAHOO.register("json",YAHOO.lang.JSON,{version:"2.6.0",build:"1321"});document.iframeLoaders = {};

iframe = function() { this.initialize.apply(this, arguments); };
iframe.prototype = {
	initialize: function(form, options,count){
		if (!options) options = {};
		this.form = form;
		this.uniqueId = count;
		document.iframeLoaders[this.uniqueId] = this;
		var url = form.action + '?jsonRequest=' + escape(form.elements[0].value); // change form submit to string; similar to changing form method to get
		var firstSlash = url.indexOf("/", url.indexOf("//")+2);
		this.transport = this.getTransport((firstSlash > 0) ? url.substring(0, firstSlash) : "");
		this.onComplete = options.onComplete || null;
		this.update = this.$(options.update) || null;
		this.updateMultiple = options.multiple || false;
		if (((navigator.vendor && (navigator.vendor.indexOf('Apple')) > -1) || window.opera) // safari and opera only
     && (/\/Direct\/Process(\?|$)/.test(form.action)) && form.elements && (form.elements.length == 1)) { // only change calls that contain 1 element and whose actions end with /Direct/Process
			var doc = this.transport.contentWindow || this.transport.contentDocument; // retrieve the document of the iframe
			if (url.length < 80000) { // allow fallback to normal submission (80k is the max length for urls in safari)
				if (doc.document) // make sure we have the document and not the window
					doc = doc.document;
				
				try { // if this fails, fallback to normal submission
					doc.location.replace(url); // use location.replace to overwrite elements in history 
					return;
				} catch (e) { };
			}
		}
		form.target= 'frame_'+this.uniqueId;
		form.setAttribute("target", 'frame_'+this.uniqueId); // in case the other one fails.
		form.submit();
	},

	onStateChange: function() {
		this.transport = this.$('frame_'+this.uniqueId);
		try {	 var doc = this.transport.contentDocument.body.innerHTML; this.transport.contentDocument.close(); }	// For NS6
		catch (e){ 
			try{ var doc = this.transport.contentWindow.document.body.innerHTML; this.transport.contentWindow.document.close(); } // For IE5.5 and IE6
			 catch (e){
				 try { var doc = this.transport.document.body.innerHTML; this.transport.document.body.close(); } // for IE5
					catch (e) {
						try	{ var doc = window.frames['frame_'+this.uniqueId].document.body.innerText; } // for really nasty browsers
						catch (e) { //alert(e); 
						} // forget it.
				 }
			}
		}
		this.transport.responseText = doc;
		if (this.onComplete) setTimeout(this.bind(function(){this.onComplete(this.transport);}, this), 10);
		if (this.update) setTimeout(this.bind(function(){this.update.innerHTML = this.transport.responseText;}, this), 10);
		if (this.updateMultiple){ setTimeout(this.bind(function(){ // JSON support!
				try	{ var hasscript = false; eval("var inputObject = "+this.transport.responseText);	// we're expecting a JSON object, eval it to inputObject
					for (var i in inputObject) { if (i == 'script') { hasscript = true; } // check if we passed some javascript along too
						else {if ( elm = this.$(i)) { elm.innerHTML = inputObject[i]; } else { 
						//alert("element "+i+" not found!"); 
						} } // if it's not script, update the corresponding div
					} if (hasscript) eval(inputObject['script']); // some on-the-fly-javascript exchanging support too
				} catch (e) { //alert('There was an error processing: '+this.transport.responseText); 
				} // in case of an error					
			}, this), 10);
		}	
	},

	getTransport: function(baseUrl) {
		var divElm = document.createElement('DIV'), frame;
		divElm.setAttribute('style', 'width: 0; height: 0; margin: 0; padding: 0; visibility: hidden; overflow: hidden');
		if (navigator.userAgent.indexOf('MSIE') > 0 && navigator.userAgent.indexOf('Opera') == -1) {// switch to the crappy solution for IE
			divElm.style.width = 0;
			divElm.style.height = 0;
			divElm.style.margin = 0;
			divElm.style.padding = 0;
			divElm.style.visibility = 'hidden';
			divElm.style.overflow = 'hidden';
			divElm.innerHTML = '<iframe name=\"frame_'+this.uniqueId+'\" id=\"frame_'+this.uniqueId+'\" src=\"' + baseUrl + '/ver1.0/Content/blank.html\" onload=\"setTimeout(function(){document.iframeLoaders['+this.uniqueId+'].onStateChange()},20);"></iframe>';
		} else {
			frame = document.createElement("iframe");
			frame.setAttribute("name", "frame_"+this.uniqueId);
			frame.setAttribute("id", "frame_"+this.uniqueId);
			frame.addEventListener("load", this.bind(function(){ this.onStateChange(); }, this), false);
			divElm.appendChild(frame);
		}
    (RequestBatch.container || document.body).appendChild(divElm);
		return frame;
	},
  
  bind: function(functionObject, referenceObject) {
    return function() {
      return functionObject.apply(referenceObject, arguments);
    }
  },
  
  '$': function(id) {
    return document.getElementById(id);
  }
};
if (typeof(RequestBatch) === 'undefined') {
    RequestBatch = function() {
      this.initialize.apply(this, arguments);
    };
    // for unique id
    var counter = 0;

    // how many requests are still pending?
    var pendingRequests = 0;

    function DirectAccessErrorHandler(msg,ex){
    //alert(msg);
    }
    (function() {

        function buildJsonpUrl(serverUrl, jsonString, callbackName) {
            var separator = serverUrl.indexOf('?') == -1 ? "?" : "&";
            // use Jsonp endpoint instead of Process
            serverUrl = serverUrl.replace('/Process', '/Jsonp');
            return serverUrl + separator + "r=" + encodeURIComponent(jsonString) + '&cb=' + callbackName;
        }

        function useJsonp(serverUrl, jsonString, callbackName) {
            // use Jsonp endpoint instead of Process
            serverUrl = buildJsonpUrl(serverUrl, jsonString, callbackName);
            var isIE = /*@cc_on!@*/false;
            if ((isIE && serverUrl.length < 2083) || (!isIE && serverUrl.length < 4000)) {
                return serverUrl;
            }
            return false;
        }

        // the core object to request batches
        RequestBatch.prototype = {
            initialize: function() {
                this.UniqueId = counter++;
                this.Requests = new Array()
            },

            HasTemplate: function() {
                return typeof (this["Template"]) != "undefined";
            },

            AddToRequest: function(requestThis) {
                this.Requests[this.Requests.length] = requestThis;
            },

            BeginRequest: function(serverUrl, callback) {
                pendingRequests++;

                if (!RequestBatch.callbacks) {
                    RequestBatch.callbacks = {};
                }

                // the cc_on comment below is important.. if you remove it, it will change the processing of the script
                // see http://msdn.microsoft.com/en-us/library/8ka90k2e(VS.85).aspx for details of conditional compilation
                var jsonString = YAHOO.lang.JSON.stringify(this), ie = /*@cc_on!@*/false;
                if (ie && !RequestBatch.container) { // forcibly take this route only for ie
                    var body = document.body, div;
                    RequestBatch.container = div = body.insertBefore(document.createElement('div'), body.firstChild);
                    div.style.height = div.style.width = div.style.margin = div.style.padding = 0;
                    div.style.visibility = div.style.overflow = 'hidden';
                    div.style.display = 'none';
                }
                // generate our callback function that will call their callback function via closure semantics
                var daapiCallbackName = 'daapiCallback' + this.UniqueId;
                var thisRequest = this;
                if (jsonpServerUrl = useJsonp(serverUrl, jsonString, 'RequestBatch.callbacks.' + daapiCallbackName)) {
                    // insert script node with callback function = daapiCallbackName
                    var jsonpScriptNode = document.createElement('script');
                    jsonpScriptNode.type = "text/javascript";
                    jsonpScriptNode.src = jsonpServerUrl;
                    var headElem = document.getElementsByTagName('head')[0];
                    RequestBatch.callbacks[daapiCallbackName] = (function(userCallback, headElem, scriptNode) {
                        return function(responses) {
                            if (thisRequest.HasTemplate()) {
                                userCallback(responses);
                            } else {
                                // clean up after ourselves
                                userCallback(responses.ResponseBatch);
                                userCallback = headElem = scriptNode = null;
                            }
                        }
                    })(callback, headElem, jsonpScriptNode);
                    headElem.appendChild(jsonpScriptNode);
                }
                else {
                    var form = generateForm(this.UniqueId, serverUrl, jsonString);
                    new iframe(form, { onComplete: function(request) { processResponse(callback, request, thisRequest.HasTemplate()); } }, this.UniqueId);
                }
                // in case they reuse the requestbatch
                this.UniqueId = counter++;
            }
        };
    })();
}

function generateForm(formId, serverUrl, inputVal) {
    // create the form
	var form = document.createElement("form");
	form.acceptCharset = "UTF-8";
	form.name = "f" + formId;
	form.id = "f" + formId;
	form.action = serverUrl;

	// create the input element on the form
	var inputElem = document.createElement("input");
	inputElem.name = "jsonRequest";
	inputElem.type = "hidden";
	inputElem.value = inputVal;
	form.appendChild(inputElem);

	// Firefox has a behavior on refresh that displays a popup confirming that is it reloading a form.
	// We work around this by attempting to perform a get action if the size is below a threshold, else
	// we will run as a post
	form.method = "post";
    if(navigator.userAgent.toLowerCase().indexOf('firefox') != -1) {
        var separator = serverUrl.indexOf('?') == -1 ? "?" : "&";
        var fullRequestURL = serverUrl + separator + "jsonRequest="+ escape(inputVal);
        if (fullRequestURL.length < 4000) {
            // we plan to perform a get, so we need to parse the sid out of the url and place it
            // inside the form
            var sidPos = serverUrl.indexOf('sid=');
            if (sidPos != -1) {
                var endPos = serverUrl.indexOf('&', sidPos);
                var sid = serverUrl.substring(sidPos + 'sid='.length, endPos == -1 ? serverUrl.length : endPos);
	            var sidInputElem = document.createElement("input");
	            sidInputElem.name = "sid";
	            sidInputElem.type = "hidden";
	            sidInputElem.value = sid;
	            form.appendChild(sidInputElem);
	            // remove the sid from the url
	            form.action = serverUrl.substring(0, sidPos-1);
            }
            form.method = "get";
        }
    }

	(RequestBatch.container || document.body).appendChild(form);
	return form;
}

function processResponse(callback, request, isTemplated)
{
    pendingRequests--;
    try {
        if (isTemplated) {
            callback(request.ResponseText);
        } else {
            var jsonResponse = unescape(request.responseText);
            jsonResponse = jsonResponse.replace(/\\\>/g, ">");
            var responseObject = YAHOO.lang.JSON.parse(jsonResponse);
            try {
                callback(responseObject.ResponseBatch);
            } catch (e) {
                DirectAccessErrorHandler("exception during client callback", e);
            }
        }
    } catch (e) {
        DirectAccessErrorHandler("exception during processResponse", e);
    }
}

function getPendingRequestCount()
{
    return pendingRequests;
}

// ------------------------------------------------------------------------------------
// This file contains all the request type objects for the SiteLife JSON Direct API.
// Create instances of these objects, place them in a RequestBatch, and send them off.
// ------------------------------------------------------------------------------------

(function() { // wrapped in a function to keep the Class variable out of the global scope
var Class = function() {
  return function() {
    this.initialize.apply(this, arguments);
  }
};
// Identify a user
UserKey = Class();
UserKey.prototype = {
   initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.UserKey = data;
   }
};
// Identify a comment
CommentKey = Class();
CommentKey.prototype = {
   initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.CommentKey = data;
   }
};
// Identify an article
ArticleKey = Class();
ArticleKey.prototype = {
   initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.ArticleKey = data;
   }
};

// Identify a persona message
PersonaMessageKey = Class();
PersonaMessageKey.prototype = {
   initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.PersonaMessageKey = data;
   }
};

// Identify a review
ReviewKey = Class();
ReviewKey.prototype = {
   initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.ReviewKey = data;
   }
};

// Identify a gallery
GalleryKey = Class();
GalleryKey.prototype = {
    initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.GalleryKey = data;
    }
};

// Identify a photo
PhotoKey = Class();
PhotoKey.prototype = {
    initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.PhotoKey = data;
    }
};

// Identify a video
VideoKey = Class();
VideoKey.prototype = {
    initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.VideoKey = data;
    }
};

// Identify a blog with this blog key
BlogKey = Class();
BlogKey.prototype = {
   initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.BlogKey = data;
   }
};

// Identify a blog post with this blog post key
BlogPostKey = Class();
BlogPostKey.prototype = {
   initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.BlogPostKey = data;
   }
};

// Identify a custom item with this CustomItemKey
CustomItemKey = Class();
CustomItemKey.prototype = {
   initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.CustomItemKey = data;
   }
};

// Identify a custom collection with this CustomCollectionKey
CustomCollectionKey = Class();
CustomCollectionKey.prototype = {
   initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.CustomCollectionKey = data;
   }
};


// Identify a Forum Category
ForumCategoryKey = Class();
ForumCategoryKey.prototype = {
    initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.ForumCategoryKey = data;
    }
};

// Identify a Forum
ForumKey = Class();
ForumKey.prototype = {
    initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.ForumKey = data;
    }
};

// Identify a forum discussion with this DiscussionKey 
DiscussionKey = Class();
DiscussionKey.prototype = {
   initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.DiscussionKey = data;
   }
};

// Identify a Forum Post
ForumPostKey = Class();
ForumPostKey.prototype = {
    initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.ForumPostKey = data;
    }
};

// Identify an Event
EventKey = Class();
EventKey.prototype = {
    initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.EventKey = data;
    }
};

// Identify an Event
EventSetKey = Class();
EventSetKey.prototype = {
    initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.EventSetKey = data;
    }
};

// Identify a Community Group
CommunityGroupKey = Class();
CommunityGroupKey.prototype = {
    initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.CommunityGroupKey = data;
    }
};

// Identify a CommunityGroup Membership
CommunityGroupMembershipKey = Class();
CommunityGroupMembershipKey.prototype = {
    initialize: function(communityGroupKey, userKey) {
        var data = new Object();
        data.CommunityGroupKey = communityGroupKey;
        data.UserKey = userKey;
        this.CommunityGroupMembershipKey = data;
    }
};


// Identify a CommunityGroup Invitation
CommunityGroupInvitationKey = Class();
CommunityGroupInvitationKey.prototype = {
    initialize: function(communityGroupKey, userKey) {
        var data = new Object();
        data.CommunityGroupKey = communityGroupKey;
        data.UserKey = userKey;
        this.CommunityGroupInvitationKey = data;
    }
};

// Identify a CommunityGroup Registrant
CommunityGroupRegistrantKey = Class();
CommunityGroupRegistrantKey.prototype = {
    initialize: function(communityGroupKey, userKey) {
        var data = new Object();
        data.CommunityGroupKey = communityGroupKey;
        data.UserKey = userKey;
        this.CommunityGroupRegistrantKey = data;
    }
};

// Identify a CommunityGroup Banned User
CommunityGroupBannedUserKey = Class();
CommunityGroupBannedUserKey.prototype = {
    initialize: function(communityGroupKey, userKey) {
        var data = new Object();
        data.CommunityGroupKey = communityGroupKey;
        data.UserKey = userKey;
        this.CommunityGroupBannedUserKey = data;
    }
};

PollKey = Class();
PollKey.prototype = {
    initialize: function(pollKey) {
        var data = new Object();
        data.Key = pollKey;
        this.PollKey = data;
    }
}

// Points/Badging
BadgeFamilyKey = Class();
BadgeFamilyKey.prototype = {
    initialize: function(badgeFamilyKey) {
        var data = new Object();
        data.Key = badgeFamilyKey;
        this.BadgeFamilyKey = data;
    }
}

LeaderboardKey = Class();
LeaderboardKey.prototype = {
    initialize: function(leaderboardKey) {
        var data = new Object();
        data.Key = leaderboardKey;
        this.LeaderboardKey = data;
    }
}

// Wrapper to request a comment page
CommentPage = Class();
CommentPage.prototype = {
   initialize: function(articleKey, numberPerPage, onPage, sort, findCommentKey) {
        var data = new Object();
        data.ArticleKey = articleKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        data.FindCommentKey = findCommentKey;
        this.CommentPage = data;
   }
};

// Wrapper to request a persona message page
PersonaMessagePage = Class();
PersonaMessagePage.prototype = {
   initialize: function(userKey, numberPerPage, onPage, sort) {
        var data = new Object();
        data.UserKey = userKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        this.PersonaMessagePage = data;
   }
};

// Wrapper to request a review page
ReviewPage = Class();
ReviewPage.prototype = {
   initialize: function(articleKey, numberPerPage, onPage,sort) {
        var data = new Object();
        data.ArticleKey = articleKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        this.ReviewPage = data;
   }
};

// wrapper to request a page of reviews by user
UserReviewPage = Class();
UserReviewPage.prototype = {
    initialize: function(userKey, numberPerPage, onPage, sort) {
        var data = new Object();
        data.UserKey = userKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        this.UserReviewPage = data;
    }
};

// Wrapper of types a gallery can contain
MediaType = Class();
MediaType.prototype = {
    initialize: function(name) {
        var data = new Object();
        data.Name = name;
        this.MediaType = data;
    }
};
// Wrapper to request a page of public galleries
PublicGalleryPage = Class();
PublicGalleryPage.prototype = {
    initialize: function(numberPerPage, onPage, mediaType) {
        var data = new Object();
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.MediaType = mediaType;
        this.PublicGalleryPage = data;
    }
};
// Wrapper to request a page of user galleries
UserGalleryPage = Class();
UserGalleryPage.prototype = {
    initialize: function(userKey, numberPerPage, onPage, mediaType) {
        var data = new Object();
        data.UserKey = userKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.MediaType = mediaType;
        this.UserGalleryPage = data;
    }
};
// Wrapper to request a page of photos
PhotoPage = Class();
PhotoPage.prototype = {
    initialize: function(galleryKey, numberPerPage, onPage, sort) {
        var data = new Object();
        data.GalleryKey = galleryKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        this.PhotoPage = data;
    }
};
// Wrapper to request a page of videos
VideoPage = Class();
VideoPage.prototype = {
    initialize: function(galleryKey, numberPerPage, onPage, sort) {
        var data = new Object();
        data.GalleryKey = galleryKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        this.VideoPage = data;
    }
};
// Wrapper to request a comment action
CommentAction = Class();
CommentAction.prototype = {
   initialize: function(commentOnKey, onPageUrl, onPageTitle, commentBody) {
        var data = new Object();
        data.CommentOnKey = commentOnKey;
        data.OnPageUrl = onPageUrl;
        data.OnPageTitle = onPageTitle;
        data.CommentBody = commentBody;
        this.CommentAction = data;
   }
};
// Wrapper to request a review action
ReviewAction = Class();
ReviewAction.prototype = {
   initialize: function(reviewOnThisKey, onPageUrl, onPageTitle, 
                        reviewTitle, reviewRating, reviewBody, reviewPros, reviewCons) {
        var data = new Object();
        data.ReviewOnKey = reviewOnThisKey;
        data.OnPageUrl = onPageUrl;
        data.OnPageTitle = onPageTitle;
        data.ReviewTitle = reviewTitle;
        data.ReviewRating = reviewRating;
        data.ReviewBody = reviewBody;
        data.ReviewPros = reviewPros;
        data.ReviewCons = reviewCons;
        this.ReviewAction = data;
   }
};
// Wrapper to request a recommend action
RecommendAction = Class();
RecommendAction.prototype = {
   initialize: function(recommendThisKey, articleTitle) {
        var data = new Object();
        data.RecommendThisKey = recommendThisKey;
        if(articleTitle){
			data.OnPageTitle = articleTitle;
		}
		
        this.RecommendAction = data;
   }
};
// Wrapper to request a rate action
RateAction = Class();
RateAction.prototype = {
   initialize: function(rateThisKey, rating) {
        var data = new Object();
        data.RateThisKey = rateThisKey;
        data.Rating = rating;
        this.RateAction = data;
   }
};

// Permanently delete a gallery, video or photo
DeleteContentAction = Class();
DeleteContentAction.prototype = {
   initialize: function(deleteThisContent) {
        var data = new Object();
        data.DeleteThisContent = deleteThisContent;
        this.DeleteContentAction = data;
   }
};

// Email from the SiteLife system
EmailContentAction = Class();
EmailContentAction.prototype = {
   initialize: function(toAddress, subject, body) {
        var data = new Object();
        data.ToAddress = toAddress;
        data.Subject = subject;
        data.Body = body;
        this.EmailContentAction = data;
   }
};

// Email from the SiteLife system with user key as target
EmailContentWithUserIDAction = Class();
EmailContentWithUserIDAction.prototype = {
   initialize: function(toUserKey, subject, body) {
        var data = new Object();
        data.UserKey = toUserKey;
        data.Subject = subject;
        data.Body = body;
        this.EmailContentWithUserIDAction = data;
   }
};

// Wrapper to request a report abuse action
ReportAbuseAction = Class();
ReportAbuseAction.prototype = {
   initialize: function(reportThisKey, abuseReason, abuseDescription) {
        var data = new Object();
        data.ReportThisKey = reportThisKey;
        data.AbuseReason = abuseReason;
        data.AbuseDescription = abuseDescription;
        this.ReportAbuseAction = data;
   }
};
// Category used for discovery
Category = Class();
Category.prototype = {
   initialize: function(name) {
        var data = new Object();
        data.Name = name;
        this.Category = data;
   }
};
// Section used for discovery
Section = Class();
Section.prototype = {
    initialize: function(name) {
        var data = new Object();
        data.Name = name;
        this.Section = data;
    }
};
// Update or create an article
UpdateArticleAction = Class();
UpdateArticleAction.prototype = {
   initialize: function(updateArticle, onPageUrl, onPageTitle, section,categories) {
        var data = new Object();
        data.UpdateArticle = updateArticle;
        data.OnPageUrl = onPageUrl;
        data.OnPageTitle = onPageTitle;
        data.Section = section;
        data.Categories = categories;
        this.UpdateArticleAction = data;
   }
};
// Update or create a gallery
UpdateGalleryAction = Class();
UpdateGalleryAction.prototype = {
    initialize: function(updateGallery, galleryType, mediaType, title, description, tags, section, galleryPromo) {
        var data = new Object();
        data.UpdateGallery = updateGallery;
        data.GalleryType = galleryType;
        data.MediaType = mediaType;
        data.Title = title;
        data.Description = description;
        data.Tags = tags;
        data.Section = section;
        data.GalleryPromo = galleryPromo;
        this.UpdateGalleryAction = data;
    }
};
// Update or create a photo
UpdatePhotoAction = Class();
UpdatePhotoAction.prototype = {
    initialize: function(updatePhoto, title, description, tags, section) {
        var data = new Object();
        data.UpdatePhoto = updatePhoto;
        data.Title = title;
        data.Description = description;
        data.Tags = tags;
        data.Section = section;
        this.UpdatePhotoAction = data;
    }
};
// Update or create a video
UpdateVideoAction = Class();
UpdateVideoAction.prototype = {
    initialize: function(updateVideo, title, description, tags, section) {
        var data = new Object();
        data.UpdateVideo = updateVideo;
        data.Title = title;
        data.Description = description;
        data.Tags = tags;
        data.Section = section;
        this.UpdateVideoAction = data;
    }
};
// 
GalleryType = Class();
GalleryType.prototype = {
    initialize: function(name) {
        var data = new Object();
        data.Name = name;
        this.GalleryType = data;
    }
};
// GalleryPromo used for setting promotional text for public galleries
GalleryPromo = Class();
GalleryPromo.prototype = {
    initialize: function(title, body, photoKey) {
        var data = new Object();
        data.Title = title;
        data.Body = body;
        data.PhotoKey = photoKey;
        this.GalleryPromo = data;
    }
};
// UserTier used for discovery
UserTier = Class();
UserTier.prototype = {
    initialize: function(name) {
        var data = new Object();
        data.Name = name;
        this.UserTier = data;
    }
};
// MembershipTier used for community groups
MembershipTier = Class();
MembershipTier.prototype = {
    initialize: function(name) {
        var data = new Object();
        data.Name = name;
        this.MembershipTier = data;
    }
};
// Activity used for discovery
Activity = Class();
Activity.prototype = {
    initialize: function(name) {
        var data = new Object();
        data.Name = name;
        this.Activity = data;
    }
};
// Discovery on articles
DiscoverArticlesAction = Class();
DiscoverArticlesAction.prototype = {
   initialize: function(searchSections,searchCategories,limitToContributors,activity,age,maximumNumberOfDiscoveries) {
        var data = new Object();
        data.SearchSections = searchSections;
        data.SearchCategories = searchCategories;
        data.LimitToContributors = limitToContributors;
        data.Activity = activity;
        data.Age = age;
        data.MaximumNumberOfDiscoveries = maximumNumberOfDiscoveries;

        this.DiscoverArticlesAction = data;
   }
};

// Action used to add a friend
AddFriendAction = Class();
AddFriendAction.prototype = {
    initialize: function(friendUserKey) {
        var data = new Object();
        data.FriendUserKey = friendUserKey;
        this.AddFriendAction = data;
    }
};

// Action used to add a message
AddPersonaMessageAction = Class();
AddPersonaMessageAction.prototype = {
    initialize: function(toUserKey, body) {
        var data = new Object();
        data.ToUserKey = toUserKey;
        data.Body = body;
        this.AddPersonaMessageAction = data;
    }
};

// Action used to remove a message
RemovePersonaMessageAction = Class();
RemovePersonaMessageAction.prototype = {
    initialize: function(personaMessageKey) {
        var data = new Object();
        data.PersonaMessageKey = personaMessageKey;
        this.RemovePersonaMessageAction = data;
    }
};

// Action used to approve a friend
ApproveFriendAction = Class();
ApproveFriendAction.prototype = {
    initialize: function(friendUserKey, isApproved) {
        var data = new Object();
        data.FriendUserKey = friendUserKey;
        data.IsApproved = isApproved;
        this.ApproveFriendAction = data;
    }
};

// Action used to remove a friend
RemoveFriendAction = Class();
RemoveFriendAction.prototype = {
    initialize: function(friendUserKey) {
        var data = new Object();
        data.FriendUserKey = friendUserKey;
        this.RemoveFriendAction = data;
    }
};

// Action used to add an enemy
AddEnemyAction = Class();
AddEnemyAction.prototype = {
    initialize: function(enemyUserKey) {
        var data = new Object();
        data.EnemyUserKey = enemyUserKey;
        this.AddEnemyAction = data;
    }
};

// Action used to remove an enemy
RemoveEnemyAction = Class();
RemoveEnemyAction.prototype = {
    initialize: function(enemyUserKey) {
        var data = new Object();
        data.EnemyUserKey = enemyUserKey;
        this.RemoveEnemyAction = data;
    }
};

// Wrapper to request a friend page
FriendPage = Class();
FriendPage.prototype = {
   initialize: function(userKey, numberPerPage, onPage, isPendingList, filterKey, filterValue) {
        var data = new Object();
        data.UserKey = userKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.IsPendingList = isPendingList;
        data.FilterKey = filterKey;
        data.FilterValue = filterValue;
        this.FriendPage = data;
   }
};

// Wrapper to request if a given user key is a friend of the user specified by the second parameter
// if the userKey parameter is not specified, the currently logged-in user is used
IsFriend = Class();
IsFriend.prototype = {
   initialize: function(friendUserKey, userKey) {
        var data = new Object();
        data.FriendUserKey = friendUserKey;
        data.UserKey = userKey;
        this.IsFriend = data;
   }
};
												
// Wrapper to request a friend page
EnemyPage = Class();
EnemyPage.prototype = {
   initialize: function(userKey, numberPerPage, onPage, sort) {
        var data = new Object();
        data.UserKey = userKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        this.EnemyPage = data;
   }
};
												
// Discovery on content
DiscoverContentAction = Class();
DiscoverContentAction.prototype = {
   initialize: function(searchSections,searchCategories,limitToContributors,activity,contentType,age,maximumNumberOfDiscoveries, filterBySiteOfOrigin, parentKeys) {
        var data = new Object();
        data.SearchSections = searchSections;
        data.SearchCategories = searchCategories;
        data.LimitToContributors = limitToContributors;
        data.Activity = activity;
        data.ContentType = contentType;
        data.Age = age;
        data.MaximumNumberOfDiscoveries = maximumNumberOfDiscoveries;
        data.FilterBySiteOfOrigin = filterBySiteOfOrigin;
        if(parentKeys){
			data.ParentKeys = parentKeys;
		}	
        this.DiscoverContentAction = data;
   }
};

// Content type for discovery
ContentType = Class();
ContentType.prototype = {
    initialize: function(name) {
        var data = new Object();
        data.Name = name;
        this.ContentType = data;
    }
};
												
UpdateUserProfileAction = Class();
UpdateUserProfileAction.prototype = {
   initialize: function(   userKey, 
                            aboutMe, 
                            location,
                            signature,
                            dateOfBirth, 
                            sex, 
                            personaPrivacyMode, 
                            commentsTabVisible, 
                            photosTabVisible, 
                            messagesOpenToEveryone, 
                            isEmailNotificationsEnabled, 
                            selectedStyleId, 
                            customAnswers, 
                            extendedProfile) {
                            
        var data = new Object();
        data.UserKey = userKey;
        data.AboutMe = aboutMe;
        data.Location = location;
        data.Signature = signature;
        data.DateOfBirth = dateOfBirth;
        data.Sex = sex;
		data.PersonaPrivacyMode = personaPrivacyMode;
		data.CommentsTabVisible = commentsTabVisible;
		data.PhotosTabVisible = photosTabVisible;
		data.MessagesOpenToEveryone = messagesOpenToEveryone;
		data.IsEmailNotificationsEnabled = isEmailNotificationsEnabled;
		data.SelectedStyleId = selectedStyleId;
		data.CustomAnswers = customAnswers;
		data.ExtendedProfile = extendedProfile;        
        this.UpdateUserProfileAction = data;
   }
};

UpdateUserBlockedSettingAction = Class();
UpdateUserBlockedSettingAction.prototype = {
    initialize: function( userKey, isBlocked ){
        var data = new Object;
        data.UserKey = userKey;
        data.IsBlocked = isBlocked;
        this.UpdateUserBlockedSettingAction = data;
    }    
};

SearchAction = Class();
SearchAction.prototype = {
   initialize: function(searchType, searchString, numberPerPage, onPage ) {
        var data = new Object();
        data.SearchType = searchType;
        data.SearchString = searchString;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        this.SearchAction = data;
   }
};

// Wrapper to request a watch item page
WatchItemPage = Class();
WatchItemPage.prototype = {
   initialize: function(userKey, numberPerPage, onPage) {
        var data = new Object();
        data.UserKey = userKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        this.WatchItemPage = data;
   }
};

// Wrapper to add a watch item
AddWatchItemAction = Class();
AddWatchItemAction.prototype = {
   initialize: function(userKey, watchTargetKey, title, url ) {
        var data = new Object();
        data.UserKey = userKey;
        data.WatchTargetKey = watchTargetKey;
        data.WatchItemTitle = title;
        data.WatchItemUrl = url;
        this.AddWatchItemAction = data;
   }
};

// Wrapper to delete a watch item
DeleteWatchItemAction = Class();
DeleteWatchItemAction.prototype = {
   initialize: function(userKey, watchTargetKey) {
        var data = new Object();
        data.UserKey = userKey;
        data.WatchTargetKey = watchTargetKey;
        this.DeleteWatchItemAction = data;
   }
};

// Wrapper to request a blog post page
BlogPostPage = Class();
BlogPostPage.prototype = {
   initialize: function(blogKey, numberPerPage, onPage, sort, blogPostState, restrictToOwner, includeFuturePosts) {
        var data = new Object();
        data.BlogKey = blogKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        data.BlogPostState = blogPostState;
        if ((typeof(restrictToOwner) == 'undefined') || (restrictToOwner == null)) {
            // Default to false for backwards compatibility
            restrictToOwner = false;
        }
        data.RestrictToOwner = restrictToOwner.toString();
        if ((typeof(includeFuturePosts) == 'undefined') || (includeFuturePosts == null)) {
            // Default to false for backwards compatibility
            includeFuturePosts = false;
        }
        data.IncludeFuturePosts = includeFuturePosts.toString();
        this.BlogPostPage = data;
   }
};

// Wrapper to request a blog post page by Tag
BlogPostsByTagPage = Class();
BlogPostsByTagPage.prototype = {
   initialize: function(blogKey, tag, numberPerPage, onPage, sort) {
        var data = new Object();
        data.BlogKey = blogKey;
        data.Tag = tag;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        this.BlogPostsByTagPage = data;
   }
};


// Wrapper to request a blog post archive count
BlogPostArchiveCount = Class();
BlogPostArchiveCount.prototype = {
   initialize: function(blogKey) {
        var data = new Object();
        data.BlogKey = blogKey;
        this.BlogPostArchiveCount = data;
   }
};


// Wrapper to request a blog post archive content page
BlogPostArchiveContentPage = Class();
BlogPostArchiveContentPage .prototype = {
   initialize: function(blogKey, month, numberPerPage, onPage, sort) {
        var data = new Object();
        data.BlogKey = blogKey;
        data.Month = month;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        this.BlogPostArchiveContentPage = data;
   }
};


// Wrapper to request a user comment page
UserCommentPage = Class();
UserCommentPage.prototype = {
   initialize: function(userKey, numberPerPage, onPage, sort, commentsOnly) {
        var data = new Object();
        data.UserKey = userKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        data.CommentsOnly = commentsOnly;
        this.UserCommentPage = data;
   }
};


// Wrapper to request blog tag 
RecentBlogTag = Class();
RecentBlogTag.prototype = {
   initialize: function(blogKey) {
        var data = new Object();
        data.BlogKey = blogKey;
        this.RecentBlogTag = data;
   }
};


// Wrapper to request recent user photo page
RecentUserPhotoPage = Class();
RecentUserPhotoPage.prototype = {
   initialize: function(userKey, numberPerPage, onPage) {
        var data = new Object();
        data.UserKey = userKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        this.RecentUserPhotoPage = data;
   }
};

// Wrapper to request recent user video page
RecentUserVideoPage = Class();
RecentUserVideoPage .prototype = {
   initialize: function(userKey, numberPerPage, onPage) {
        var data = new Object();
        data.UserKey = userKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        this.RecentUserVideoPage  = data;
   }
};


// Wrapper to request recent public gallery page
RecentPublicGalleryPage = Class();
RecentPublicGalleryPage .prototype = {
   initialize: function(userKey, numberPerPage, onPage) {
        var data = new Object();
        data.UserKey = userKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        this.RecentPublicGalleryPage  = data;
   }
};
    
    
// Wrapper to request recent user activity page
RecentUserActivity = Class();
RecentUserActivity .prototype = {
   initialize: function(userKey) {
        var data = new Object();
        data.UserKey = userKey;
       this.RecentUserActivity  = data;
   }
};

  
// Wrapper to request page of user media submission counts
UserMediaSubmissionsCountPage = Class();
UserMediaSubmissionsCountPage .prototype = {
    initialize: function(userKey, mediaType, numberPerPage, onPage) {
        var data = new Object();
        data.UserKey = userKey;
        data.MediaType = mediaType;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        this.UserMediaSubmissionsCountPage = data;
    }
};


// Wrapper to request recent forum discussion page
RecentForumDiscussionPage = Class();
RecentForumDiscussionPage .prototype = {
   initialize: function(userKey, numberPerPage, onPage) {
        var data = new Object();
        data.UserKey = userKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        this.RecentForumDiscussionPage = data;
   }
};

    
// Wrapper to request user group forum page
UserGroupForumPage = Class();
UserGroupForumPage .prototype = {
   initialize: function(userKey, numberPerPage, onPage, sort) {
        var data = new Object();
        data.UserKey = userKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        this.UserGroupForumPage = data;
   }
};

// The blogRollEntry used in UpdateBlogAction
BlogRollEntry = Class();
BlogRollEntry.prototype = {
   initialize: function(name, url) {
        var data = new Object();
        data.Name = name;
        data.Url = url;
        this.BlogRollEntry = data;
   }
};

// Bookmark used in UpdateCommunityGroupAction
Bookmark = Class();
Bookmark.prototype = {
    initialize: function(title, link) {
        var data = new Object();
        data.Title = title;
        data.Link = link;
        this.Bookmark = data;
   }
};

// CommunityGroupVisibility used in UpdateCommunityGroupAction
CommunityGroupVisibility = Class();
CommunityGroupVisibility.prototype = {
    initialize: function(name) {
        var data = new Object();
        data.Name = name;
        this.CommunityGroupVisibility = data;
    }
};

// Update or create a blog
UpdateBlogAction = Class();
UpdateBlogAction.prototype = {
   initialize: function(updateBlog, title, tagline, blogRollEntries, blogType) {
        var data = new Object();
        data.BlogKey = updateBlog;
        data.Title = title;
        data.Tagline = tagline;
        data.BlogRollEntries = blogRollEntries;
        data.BlogType = blogType;
        this.UpdateBlogAction = data;
   }
};

// Update or create a blog post, key can be either a post key (update case)
// or a blog key (create case)
UpdateBlogPostAction = Class();
UpdateBlogPostAction.prototype = {
   initialize: function(key, title, body, tags, publishDate, published) {
        var data = new Object();
        data.TargetThis = key;
        data.Title = title;
        data.Body = body;
        data.Tags = tags;
        data.Date = publishDate;
        data.Published = published;
        this.UpdateBlogPostAction = data;
   }
};

// Identify a forum discussion with this DiscussionKey 
DiscussionKey = Class();
DiscussionKey.prototype = {
   initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.DiscussionKey = data;
   }
};

// Identify a custom item with this CustomItemKey
CustomItemKey = Class();
CustomItemKey.prototype = {
   initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.CustomItemKey = data;
   }
};

// Identify a custom collection with this CustomCollectionKey
CustomCollectionKey = Class();
CustomCollectionKey.prototype = {
   initialize: function(key) {
        var data = new Object();
        data.Key = key;
        this.CustomCollectionKey = data;
   }
};

// Update or create a custom item in storage
UpdateCustomItemAction = Class();
UpdateCustomItemAction.prototype = {
   initialize: function(customItemKey, name, mimeType, displayText, content, includeInRecentActivity) {
        var data = new Object();
        data.CustomItemKey = customItemKey;
        data.Name = name;
        data.MimeType = mimeType;
        data.DisplayText = displayText;
        data.Content = content;
        if ((typeof(includeInRecentActivity) == 'undefined') || (includeInRecentActivity == null)) {
            // Default to true for backwards compatibility
            includeInRecentActivity = true;
        }
        data.IncludeInRecentActivity = includeInRecentActivity
        this.UpdateCustomItemAction = data;
   }
};

// Add a new custom collection to storage
AddCustomCollectionAction = Class();
AddCustomCollectionAction.prototype = {
   initialize: function(customCollectionKey, customCollectionName) {
        var data = new Object();
        data.CustomCollectionKey = customCollectionKey;
        data.CustomCollectionName = customCollectionName;
        this.AddCustomCollectionAction = data;
   }
};

// Insert an item into a custom collection
InsertIntoCollectionAction = Class();
InsertIntoCollectionAction.prototype = {
   initialize: function(customCollectionKey, insertThisKey, position) {
        var data = new Object();
        data.CustomCollectionKey = customCollectionKey;
        data.InsertThisKey = insertThisKey;
        data.Position = position;
        this.InsertIntoCollectionAction = data;
   }
};

// Remove an item from a custom collection (position can be null to specify to remove all occurrences of item)
RemoveFromCollectionAction = Class();
RemoveFromCollectionAction.prototype = {
   initialize: function(customCollectionKey, removeThisKey, position) {
        var data = new Object();
        data.CustomCollectionKey = customCollectionKey;
        data.RemoveThisKey = removeThisKey;
        data.Position = position;
        this.RemoveFromCollectionAction = data;
   }
};

// Get a page of items out of a custom collection
CustomCollectionPage = Class();
CustomCollectionPage.prototype = {
   initialize: function(customCollectionKey, numberPerPage, onPage, sort) {
        var data = new Object();
        data.CustomCollectionKey = customCollectionKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        this.CustomCollectionPage = data;
   }
};


// Get a page of items out of a custom collection
EditorMessageRequest = Class();
EditorMessageRequest.prototype = {
   initialize: function() {
      this.EditorMessageRequest = new Object();
   }
};

// Retrieve a user's tags for the given content type
UserTags = Class();
UserTags.prototype = {
   initialize: function(userKey, contentType) {
      var data = new Object();
      data.UserKey = userKey;
      data.ContentType = contentType;
      this.UserTags = data;
   }
};


// Get an item's ContentPolicy
GetContentPolicyAction = Class();
GetContentPolicyAction.prototype = {
    initialize: function(targetKey, userTier, action) {
        var data = new Object();
        data.TargetKey = targetKey;
        data.UserTier = userTier;
        data.ContentPolicyActionType = action;
        this.GetContentPolicyAction = data;
    }
}

// Set an item's ContentPolicy
SetContentPolicyAction = Class();
SetContentPolicyAction.prototype = {
    initialize: function(targetKey, userTier, action, policy) {
        var data = new Object();
        data.TargetKey = targetKey;
        data.UserTier = userTier;
        data.ContentPolicyActionType = action;
        data.ContentPolicy = policy;
        this.SetContentPolicyAction = data;
    }
}

ContentPolicy = Class();
ContentPolicy.prototype = {
    initialize: function(name) {
        var data = new Object();
        data.Name = name;
        this.ContentPolicy = data;
    }
};

ContentPolicyActionType = Class();
ContentPolicyActionType.prototype = {
    initialize: function(name) {
        var data = new Object();
        data.Name = name;
        this.ContentPolicyActionType = data;
    }
};

// Updates a Forum's meta data
UpdateForumAction = Class();
UpdateForumAction.prototype = {
    initialize: function(forumKey, title, description) {
        var data = new Object();
        data.ForumKey = forumKey;
        data.Title = title;
        data.Description = description;
        this.UpdateForumAction = data;
    }
};

//Adds/Updates a Forum Discussion's meta data. If the key is a ForumKey, it will be added as a new Discussion.
//If the key is a ForumDiscussionKey, the existing forum discussion will be updated.
UpdateForumDiscussionAction = Class();
UpdateForumDiscussionAction.prototype = {
    initialize: function(key, title, body, isQuestion, isPoll) {
        var data = new Object();
        data.TargetThis = key;
        data.Title = title;
        data.Body = body;
        data.IsQuestion = typeof(isQuestion) == 'string' ? isQuestion : (isQuestion ? "true" : "false");
        data.IsPoll = typeof(isPoll) == 'string' ? isPoll : (isPoll ? "true" : "false");
        this.UpdateForumDiscussionAction = data;
    }
};

//Adds/Updates a Forum Post's meta data. If the key is a ForumDiscussionKey, it will be added as a new Post.
//If the key is a ForumPostKey, the existing forum post will be updated.
UpdateForumPostAction = Class();
UpdateForumPostAction.prototype = {
    initialize: function(key, title, body, isQuestion) {
        var data = new Object();
        data.TargetThis = key;
        data.Title = title;
        data.Body = body;
        data.IsQuestion = isQuestion;
        this.UpdateForumPostAction = data;
    }
};

//Updates a Forum Discussion's Sticky flag
ForumToggleDiscussionStickyAction = Class();
ForumToggleDiscussionStickyAction.prototype = {
    initialize: function(discussionKey) {
        var data = new Object();
        data.DiscussionKey = discussionKey;
        this.ForumToggleDiscussionStickyAction = data;
    }
};

//Opens/Closes a Forum Discussion
ForumToggleDiscussionClosedAction = Class();
ForumToggleDiscussionClosedAction.prototype = {
    initialize: function(discussionKey) {
        var data = new Object();
        data.DiscussionKey = discussionKey;
        this.ForumToggleDiscussionClosedAction = data;
    }
};

//Retrieves a paginated list of Discussions for a particular Forum
ForumDiscussionsPage = Class();
ForumDiscussionsPage.prototype = {
    initialize: function(forumKey, numberPerPage, oneBasedOnPage, sort) {
        var data = new Object();
        data.ForumKey = forumKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = oneBasedOnPage;
        data.Sort = sort;
        this.ForumDiscussionsPage = data;
    }
};

//Retrieves a paginated list of Posts for a particular Forum
ForumPostsPage = Class();
ForumPostsPage.prototype = {
    initialize: function(forumDiscussionKey, numberPerPage, oneBasedOnPage, sort, findPostKey) {
        var data = new Object();
        data.DiscussionKey = forumDiscussionKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = oneBasedOnPage;
        data.Sort = sort;
        data.FindPostKey = findPostKey;
        this.ForumPostsPage = data;
    }
};

//Retrieves a paginated list of forums for a particular category
ForumCategoriesPage = Class();
ForumCategoriesPage.prototype = {
    initialize: function(numberPerPage, oneBasedOnPage) {
        var data = new Object();
        data.NumberPerPage = numberPerPage;
        data.OnPage = oneBasedOnPage;
        this.ForumCategoriesPage = data;
    }
};

//Retrieves a paginated list of forums for a particular category
ForumsPage = Class();
ForumsPage.prototype = {
    initialize: function(categoryKey, numberPerPage, oneBasedOnPage, sort) {
        var data = new Object();
        data.ForumCategoryKey = categoryKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = oneBasedOnPage;
        data.Sort = sort;
        this.ForumsPage = data;
    }
};

ForumSearchAction = Class();
ForumSearchAction.prototype = {
    initialize: function(searchKey, searchString, numberPerPage, onPage) {
        var data = new Object();
        data.TargetThis = searchKey;
        data.SearchString = searchString;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        this.ForumSearchAction = data;
    }
};

// Retrieves a paginated list of community groups
CommunityGroupPage = Class();
CommunityGroupPage.prototype = {
    initialize: function(numberPerPage, oneBasedOnPage, sort, section) {
        var data = new Object();
        data.NumberPerPage = numberPerPage;
        data.OnPage = oneBasedOnPage;
        data.Sort = sort;
        if ((typeof(section) == 'undefined') || (section == null)) {
            // Default section to All
            section = new Section("All");
        }
        data.Section = section;
        this.CommunityGroupPage = data;
    }
};

// Retrieves a paginated list of community groups
CommunityGroupMembership = Class();
CommunityGroupMembership.prototype = {
    initialize: function(groupKey, userKey) {
        var data = new Object();
        data.CommunityGroupKey = groupKey;
        data.UserKey = userKey;
        this.CommunityGroupMembership = data;
    }
};


// Retrieves a paginated list of community groups
CommunityGroupMembershipPage = Class();
CommunityGroupMembershipPage.prototype = {
    initialize: function(key, numberPerPage, oneBasedOnPage, sort, membershipFilter) {
        var data = new Object();
        data.Key = key;
        data.NumberPerPage = numberPerPage;
        data.OnPage = oneBasedOnPage;
        data.Sort = sort;
        data.MembershipFilter = membershipFilter;
        this.CommunityGroupMembershipPage = data;
    }
};

// Retrieves a paginated list of registrants
CommunityGroupRegistrantPage = Class();
CommunityGroupRegistrantPage.prototype = {
    initialize: function(key, numberPerPage, oneBasedOnPage, sort) {
        var data = new Object();
        data.CommunityGroupKey = key;
        data.NumberPerPage = numberPerPage;
        data.OnPage = oneBasedOnPage;
        data.Sort = sort;
        this.CommunityGroupRegistrantPage = data;
    }
};

// Retrieves a paginated list of banned users
CommunityGroupBannedUserPage = Class();
CommunityGroupBannedUserPage.prototype = {
    initialize: function(key, numberPerPage, oneBasedOnPage, sort) {
        var data = new Object();
        data.CommunityGroupKey = key;
        data.NumberPerPage = numberPerPage;
        data.OnPage = oneBasedOnPage;
        data.Sort = sort;
        this.CommunityGroupBannedUserPage = data;
    }
};

// Retrieves a paginated list of invited users
CommunityGroupInvitedUserPage = Class();
CommunityGroupInvitedUserPage.prototype = {
    initialize: function(key, numberPerPage, oneBasedOnPage, sort) {
        var data = new Object();
        data.CommunityGroupKey = key;
        data.NumberPerPage = numberPerPage;
        data.OnPage = oneBasedOnPage;
        data.Sort = sort;
        this.CommunityGroupInvitedUserPage = data;
    }
};



// Creates a new or updates an existing community group
UpdateCommunityGroupAction = Class();
UpdateCommunityGroupAction.prototype = {
    initialize: function(key, title, description, categories, visibility, bookmarks, section, photoKey) {
        var data = new Object();
        data.CommunityGroupKey = key;
        data.Title = title;
        data.Description = description;
        data.Categories = categories;
        data.Visibility = visibility,
        data.Bookmarks = bookmarks;        
        data.Section = section;
        data.PhotoKey = photoKey;
        this.UpdateCommunityGroupAction = data;
    }
};

// Updates an existing commnity group's bookmarks
UpdateCommunityGroupBookmarksAction = Class();
UpdateCommunityGroupBookmarksAction.prototype = {
    initialize: function(key, bookmarks) {
        var data = new Object();
        data.CommunityGroupKey = key;
        data.Bookmarks = bookmarks;        
        this.UpdateCommunityGroupBookmarksAction = data;
    }
};

// Creates or updates a user's membership in a group, with options to ban the user from the group.
UpdateCommunityGroupMembershipAction = Class();
UpdateCommunityGroupMembershipAction.prototype = {
    initialize: function(communityGroupKey, userKey, membershipTier, isBanned, banMessage) {
        var data = new Object();
        data.CommunityGroupKey = communityGroupKey;
        data.UserKey = userKey;
        data.MembershipTier = membershipTier;
        data.IsBanned = isBanned;
        data.BanMessage = banMessage;
        this.UpdateCommunityGroupMembershipAction = data;
    }
};

// Enables a user to request membership in a community group or an admin to invite a non-member.
RequestCommunityGroupMembershipAction = Class();
RequestCommunityGroupMembershipAction.prototype = {
    initialize: function(communityGroupKey, userKey, message) {
        var data = new Object();
        data.CommunityGroupKey = communityGroupKey;
        data.UserKey = userKey;
        data.Message = message;
        this.RequestCommunityGroupMembershipAction = data;
    }
};

//Retrieves a paginated list of Events for a particular EventSetKey
EventsPage = Class();
EventsPage.prototype = {
    initialize: function(eventSetKey, startDate, endDate,numberPerPage, oneBasedOnPage, sort) {
        var data = new Object();
        data.EventSetKey = eventSetKey;
        data.StartDate = startDate;
        data.EndDate = endDate;
        data.NumberPerPage = numberPerPage;
        data.OnPage = oneBasedOnPage;
        data.Sort = sort;
        this.EventsPage = data;
    }
};

// Update or creates an Event, key can be either an EventKey (update case)
// or an EventSetKey (create case)
UpdateEventAction = Class();
UpdateEventAction.prototype = {
    initialize: function(key, title, description, location, bookmarkName, bookmarkUrl, startDate, endDate, utcOffset) {
        var data = new Object();
        data.TargetThis = key;
        data.Title = title;
        data.Description = description;
        data.Location = location;
        data.BookmarkName = bookmarkName;
        data.BookmarkUrl = bookmarkUrl;
        data.StartDate = startDate;
        data.EndDate = endDate;
        data.UtcOffset = utcOffset;
        this.UpdateEventAction = data;
    }
};


// Retrieve a paginated list of recent group activities
RecentMiniFeedActivity = Class();
RecentMiniFeedActivity.prototype = {
    initialize: function(communityGroupKey, onPage, numberPerPage) {
        var data = new Object();
        data.CommunityGroupKey = communityGroupKey;
        data.OnPage = onPage;
        data.NumberPerPage = numberPerPage
        this.RecentMiniFeedActivity = data;
    }
}

//Retrieve a list of Most Active Users in a CommunityGroup
CommunityGroupMostActiveMembers = Class();
CommunityGroupMostActiveMembers.prototype = {
    initialize: function(communityGroupKey, age, maximumNumberOfMembers) {
        var data = new Object();
        data.CommunityGroupKey = communityGroupKey;
        data.Age = age;
        data.MaximumNumberOfMembers = maximumNumberOfMembers
        this.CommunityGroupMostActiveMembers = data;
    }
}

// perform a search for content within a specific community group
CommunityGroupSearchAction = Class();
CommunityGroupSearchAction.prototype = {
    initialize: function(communityGroupKey, searchType, searchString, numberPerPage, onPage) {
        var data = new Object();
        data.CommunityGroupKey = communityGroupKey;
        data.SearchType = searchType;
        data.SearchString = searchString;
        data.OnPage = onPage;
        data.NumberPerPage = numberPerPage;
        this.CommunityGroupSearchAction = data;
    }
}

// perform a search for content within a specific community group
RequestDeleteCommunityGroupAction = Class();
RequestDeleteCommunityGroupAction.prototype = {
    initialize: function(communityGroupKey, deleteReason) {
        var data = new Object();
        data.CommunityGroupKey = communityGroupKey;
        data.DeleteReason = deleteReason;
        this.RequestDeleteCommunityGroupAction = data;
    }
}

CommunityGroupRecentForumDiscussions = Class();
CommunityGroupRecentForumDiscussions.prototype = {
    initialize: function(communityGroupKey, age, maximumNumberOfDiscussions) {
        var data = new Object();
        data.CommunityGroupKey = communityGroupKey;
        data.Age = age;
        data.MaximumNumberOfDiscussions = maximumNumberOfDiscussions;
        this.CommunityGroupRecentForumDiscussions = data;
    }
}


SystemTimeInfo = Class();
SystemTimeInfo.prototype = {
    initialize: function(){
        var data = new Object();
        this.SystemTimeInfo = data;
    }
}

PrivateMessageFolderList = Class();
PrivateMessageFolderList.prototype = {
    initialize: function(){
        var data = new Object();
        this.PrivateMessageFolderList = data;
    }
}


PrivateMessage = Class();
PrivateMessage.prototype = {
    initialize: function(folderID, messageID){
        var data = new Object();
        data.FolderID = folderID;
        data.MessageID = messageID;
        this.PrivateMessage = data;
    }
}

PrivateMessagePage = Class();
PrivateMessagePage.prototype = {
    initialize: function(folderID, numberPerPage, onPage, messageReadState){
        var data = new Object();
        data.FolderID = folderID;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.MessageReadState = messageReadState;
        this.PrivateMessagePage = data;
    }
}

PrivateMessageSendAction = Class();
PrivateMessageSendAction.prototype = {
    initialize: function(subject, body, recipientList){
        var data = new Object();
        data.Subject = subject;
        data.Body = body;
        data.RecipientList = recipientList;
        this.PrivateMessageSendAction = data;
    }
}

PrivateMessageMoveMessageAction = Class();
PrivateMessageMoveMessageAction.prototype = {
    initialize: function(sourceFolderID, destinationFolderID, messageIDList){
        var data = new Object();
        data.SourceFolderID = sourceFolderID;
        data.DestinationFolderID = destinationFolderID;
        data.MessageIDList = messageIDList;
        this.PrivateMessageMoveMessageAction = data;
    }
}

PrivateMessageDeleteMessageAction = Class();
PrivateMessageDeleteMessageAction.prototype = {
    initialize: function(sourceFolderID, messageIDList){
        var data = new Object();
        data.SourceFolderID = sourceFolderID;
        data.MessageIDList = messageIDList;
        this.PrivateMessageDeleteMessageAction = data;
    }
}

PrivateMessageEmptyTrashAction = Class();
PrivateMessageEmptyTrashAction.prototype = {
    initialize: function(){
        var data = new Object();
        this.PrivateMessageEmptyTrashAction = data;
    }
}


PrivateMessageCreateFolderAction = Class();
PrivateMessageCreateFolderAction.prototype = {
    initialize: function(){
        var data = new Object();
        data.FolderID = "Inbox";
        this.PrivateMessageCreateFolderAction = data;
    }
}

FirstUnreadPost = Class();
FirstUnreadPost.prototype = {
	initialize: function(discussionKey, numberPerPage, sort){
		var data = new Object();
		data.DiscussionKey = discussionKey;
        data.NumberPerPage = numberPerPage;
        data.Sort = sort;
        this.FirstUnreadPost = data;
	}
}

LatestPost = Class();
LatestPost.prototype = {
	initialize: function(discussionKey, numberPerPage, sort){
		var data = new Object();
		data.DiscussionKey = discussionKey;
        data.NumberPerPage = numberPerPage;
        data.Sort = sort;
        this.LatestPost = data;
	}
}

UpdateDiscussionLastReadAction = Class();
UpdateDiscussionLastReadAction.prototype = {
	initialize: function(discussionKey, postKey, forceUpdate){
		var data = new Object();
		data.DiscussionKey = discussionKey;
		if(postKey){
			data.ForumPostKey = postKey;
		}
		if(forceUpdate){
			data.ForceUpdate = true;
		}
		else{
			data.ForceUpdate = false;
		}
		this.UpdateDiscussionLastReadAction = data;
	}
}

UpdateExternalUserIdAction = Class();
UpdateExternalUserIdAction.prototype = {
	initialize: function(externalSiteName, externalSiteUserId, forUser){
		var data = new Object();
		data.ExternalSiteName = externalSiteName;
		data.ExternalSiteUserId = externalSiteUserId;
		data.ForUser = forUser;
		this.UpdateExternalUserIdAction = data;
	}
}

UpdateSubscriptionAction = Class();
UpdateSubscriptionAction.prototype = {
    initialize: function(discussionKey, subscribe){
        var data = new Object();
        data.DiscussionKey = discussionKey;
        data.Subscribe = subscribe;
        this.UpdateSubscriptionAction = data;
    }
}

UpdatePollAction = Class();
UpdatePollAction.prototype = {
    initialize: function(pollOnKey, question, answers) {
        var data = new Object();
        data.PollOnKey = pollOnKey;
        data.Question = question;
        data.Answers = answers;
        this.UpdatePollAction = data;
    }
}

TogglePollIsClosedAction = Class();
TogglePollIsClosedAction.prototype = {
    initialize: function(pollKey) {
        var data = new Object();
        data.ToggleThisPoll = pollKey;
        this.TogglePollIsClosedAction = data;
    }
}

PostPollAnswerAction = Class();
PostPollAnswerAction.prototype = {
    initialize: function(pollToAnswer, indexOfAnswer) {
        var data = new Object();
        data.PollToAnswer = pollToAnswer;
        data.IndexOfAnswer = indexOfAnswer;
        this.PostPollAnswerAction = data;
    }
}

PollPage = Class();
PollPage.prototype = {
    initialize: function(pollOnKey, numberPerPage, onPage, sort) {
        var data = new Object();
        data.PollOnKey = pollOnKey;
        data.NumberPerPage = numberPerPage;
        data.OnPage = onPage;
        data.Sort = sort;
        this.PollPage = data;
    }
}

CheckFilteredWords = Class();
CheckFilteredWords.prototype = {
    initialize: function(keyValueDictionary) { // key is the string ID, value is the string to be checked - formatted like { "key1":"string1", "key2":"string2" }.
        var data = new Object();
        data.WordDictionary = keyValueDictionary;
        this.CheckFilteredWords = data;
    }
}

//Points&Badging
AwardPointsAction = Class();
AwardPointsAction.prototype = {
    initialize: function(userKey, points, currencyType) { 
        var data = new Object();
        data.UserKey = userKey;
        data.Points = points;
        data.CurrencyType = currencyType;
        this.AwardPointsAction = data;
    }
}

BadgeFamily = Class();
BadgeFamily.prototype = {
    initialize: function(badgeFamilyKey) { 
        var data = new Object();
        data.BadgeFamilyKey = badgeFamilyKey;
        this.BadgeFamily = data;
    }
}

BadgeFamilies = Class();
BadgeFamilies.prototype = {
    initialize: function() { 
        var data = new Object();        
        this.BadgeFamilies = data;
    }
}

BadgingEventAction = Class();
BadgingEventAction.prototype = {
    initialize: function(activityName, activityTags, userTags) { 
        var data = new Object();
        data.ActivityName = activityName;
        data.ActivityTags = activityTags
        data.UserTags = userTags;
        this.BadgingEventAction = data;
    }
}

GrantBadgeAction = Class();
GrantBadgeAction.prototype = {
    initialize: function(userKey, badgeFamilyKey, badgeKey) { 
        var data = new Object();
        data.UserKey = userKey;
        data.BadgeFamilyKey = badgeFamilyKey
        data.BadgeKey = badgeKey;
        this.GrantBadgeAction = data;
    }
}

Leaderboard = Class();
Leaderboard.prototype = {
    initialize: function(leaderboardKey) { 
        var data = new Object();
        data.LeaderboardKey = leaderboardKey;
        this.Leaderboard = data;
    }
}

Leaderboards = Class();
Leaderboards.prototype = {
    initialize: function() { 
        var data = new Object();        
        this.Leaderboards = data;
    }
}

LeaderboardRankingsPage = Class();
LeaderboardRankingsPage.prototype = {
    initialize: function(leaderboardKey, oneBasedOnPage) { 
        var data = new Object();
        data.LeaderboardKey = leaderboardKey;
        data.OnPage = oneBasedOnPage;
        this.LeaderboardRankingsPage = data;
    }
}

RevokeBadgeAction = Class();
RevokeBadgeAction.prototype = {
    initialize: function(userKey, badgeFamilyKey, badgeKey) { 
        var data = new Object();
        data.UserKey = userKey;
        data.BadgeFamilyKey = badgeFamilyKey
        data.BadgeKey = badgeKey;
        this.RevokeBadgeAction = data;
    }
}

PointsAndBadgingRuleValidationAction = Class();
PointsAndBadgingRuleValidationAction.prototype = {
    initialize: function(rules) { 
        var data = new Object();
        data.Rules = rules;
        this.PointsAndBadgingRuleValidationAction = data;
    }
}

AbuseItemPage = Class();
AbuseItemPage.prototype = {
	initialize: function(numberPerPage, onPage, section, maxReportsPerItem){
		var data = new Object();
		data.NumberPerPage = numberPerPage;
		data.OnPage = onPage;
		data.Section = section;
		data.MaxReportsPerItem = maxReportsPerItem;
		this.AbuseItemPage = data;
	}
}

AbuseItem = Class();
AbuseItem.prototype =  {
	initialize: function(targetKey){
		var data = new Object();
		data.TargetKey = targetKey;
		this.AbuseItem = data;
	}
}

ClearAbuseAction = Class();
ClearAbuseAction.prototype =  {
	initialize: function(targetKey){
		var data = new Object();
		data.TargetKey = targetKey;
		this.ClearAbuseAction = data;
	}
}

SetCommentBlockingStateAction = Class();
SetCommentBlockingStateAction.prototype = {
	initialize: function(commentKey, blockingState){
		var data = new Object();
		data.CommentKey = commentKey;
		data.CommentBlockingState = blockingState;
		this.SetCommentBlockingStateAction = data;
	}
}
	
})();
gSiteLife.mi={};var urlTS=new Date();gSiteLife.mi.commenting={submitReturnAddress:'http://'+location.host+location.pathname+"?mi_pluck_action=comment_submitted&qwxq="+Math.floor(Math.random()*10000)+urlTS.getMilliseconds()+"#Comments_Container"};gSiteLife.mi.userLoggedIn=function(){if(this.loggedIn===undefined){var cookies=document.cookie.split(';');var insiteCrumb=false;var pluckCrumb=false;for(var i=cookies.length-1;i>=0;i--){if(cookies[i].match(/^\s*AT=/)||cookies[i].match(/^\s*HD=/)){pluckCrumb=true;}
else if(cookies[i].match(/_user_auth=/)){insiteCrumb=true;}}
this.loggedIn=(insiteCrumb&&pluckCrumb);}
return this.loggedIn;};var NYX={version:"0.6"};NYX.fixConsole=function(){if(typeof window.console!="object"){window.console={};}
if(window.console.isNyxxed){}
else{var firebugMethods=["log","debug","info","warn","error","assert","dir","dirxml","trace","group","groupEnd","time","timeEnd","profile","profileEnd","count"];for(var methodIdx=0;methodIdx<firebugMethods.length;methodIdx++){var methodName=firebugMethods[methodIdx];if(typeof window.console[methodName]!="function"){window.console[methodName]=function(){};}}}
window.console.isNyxxed=true;};NYX.fixConsole();console.info("Nyx library loaded, version "+NYX.version);NYX.cache={};NYX.ieSafeExecution=function(){var This=this;this.timeoutLength=200;if(typeof arguments[0]!="function"){throw("First parameter to NYX.ieSafeExecution is required and must be a function");}else{this.functionToCall=arguments[0];}
this.execute=function(){if(typeof This.arguments=="undefined"){This.arguments=arguments;}
if(typeof document.body.attachEvent=="object"&&(document.readyState!="loaded"&&document.readyState!="complete")){if(typeof console=="object"){console.log("in the IE block");}
try{document.documentElement.doScroll("left");This.functionToCall.apply(This.functionToCall,This.arguments);}catch(error){setTimeout(This.execute,This.timeoutLength);}}else{if(typeof console=="object"){console.log("executing immediately");}
This.functionToCall.apply(This.functionToCall,This.arguments);}};};NYX.util={};NYX.util.makePuid=function(optExtraDigits,optBase){var timeSeed,rnd,puid;if(typeof optExtraDigits!="number"){optExtraDigits=5;}
if(typeof optBase!="number"){optBase=32;}
timeSeed=(new Date().valueOf())-Date.parse("1/1/2008");rnd=Math.random().toString().substr(2,optExtraDigits);puid=parseInt(timeSeed+""+rnd).toString(optBase);return puid;};NYX.util.querystring={get:function(name){var key=name+"=";var nameValuePairs=document.location.search.substring(1).split("&");for(var pairIdx=0;pairIdx<nameValuePairs.length;pairIdx++){if(nameValuePairs[pairIdx].indexOf(key)===0){return nameValuePairs[pairIdx].substring(key.length);}}
return null;},set:function(name,value,optExistingQS){var qs;if(typeof optExistingQS!="string"){qs=location.search;}else{qs=optExistingQS;}
var theReturn=qs;if(typeof value=="undefined"){value="";}
var nvp=encodeURI(name+"="+value);if(qs===""){theReturn=nvp;}else if(!NYX.util.string.contains(qs,name)){theReturn=qs+"&"+nvp;}else{var regex=new RegExp("("+name+"=[^&^]*)","gi");var qsm=qs.match(regex);if(qsm!==null){theReturn=qs.replace(qsm,nvp);}}
if(!NYX.util.string.startsWith(theReturn,"?")){theReturn="?"+theReturn;}
return theReturn;}};NYX.util.obj={extend:function(targetClass,parentClass){for(var member in parentClass){targetClass[member]=parentClass[member];}
return targetClass;}};NYX.util.array={contains:function(theArray,match){if(theArray.length){for(var idx=0;idx<theArray.length;idx++){if(theArray[idx]==match){return true;}}}
return false;}};NYX.util.string={contains:function(source,match,optIgnoreCase){if(optIgnoreCase){source=source.toLowerCase();match=match.toLowerCase();}
return(source.indexOf(match)>-1);},replaceAll:function(source,match,replacement){replacement=replacement.replace(/\$/g,'tom MI.dollar sawyer');while(this.contains(source,match)){source=source.replace(match,replacement);}
source=source.replace(/tom MI\.dollar sawyer/g,'$');return source;},ensure:function(arg){if(typeof arg=="string"){return arg;}
if(arg===null||typeof arg=="undefined"){return"";}
return arg.toString();},trim:function(stringToTrim){stringToTrim=this.ensure(stringToTrim);return stringToTrim.replace(/(^\s+|\s+$)/g,"");},isBlank:function(source){return(this.trim(source)==="");},startsWith:function(source,match,optIgnoreCase){return(source.substring(0,match.length)==match);},endsWith:function(source,match,optIgnoreCase){if(optIgnoreCase){source=source.toLowerCase();match=match.toLowerCase();}
return(source.substring(source.length-match.length)==match);}};NYX.util.dom={getElementsByClass:function(className,optElem){var theReturn=[];if(typeof optElem=="undefined"){var elem=document.body;}
var children=elem.getElementsByTagName("*");for(var childIdx=0;childIdx<children.length;childIdx++){var child=children[childIdx];if(typeof child.className=="string"&&this.elemHasClass(child,className)){theReturn.push(child);}}
return theReturn;},elemHasClass:function(elem,className){var currentClasses=elem.className.toLowerCase().split(/\s+/g);return NYX.util.array.contains(currentClasses,className.toLowerCase());}};NYX.TemplateTool={DOM_TARGET_SUFFIX:"dynamicContent",DOM_WAITMSG_SUFFIX:"waitMsg",ALT_CLASS_2:"nyx2",ALT_CLASS_3:"nyx3",getElem:function(idSuffix){return document.getElementById(this.idRoot+"_"+idSuffix);},getIndexedElem:function(idSuffix,index){return document.getElementById(this.idRoot+"_"+idSuffix+"_"+index);},showElem:function(idSuffix){var elem=this.getElem(idSuffix);if(elem!==null){elem.style.display="";}},flattenDaapiItem:function(daapiItem){var flatData={};for(var child in daapiItem){if(daapiItem[child]===null){flatData[child]=null;}else if(typeof daapiItem[child]!="object"){flatData[child]=daapiItem[child];}else{if(typeof daapiItem[child].join=="function"&&typeof daapiItem[child].length=="number"){flatData[child]=daapiItem[child];}else{for(var grandchild in daapiItem[child]){if(typeof flatData[grandchild]=="undefined"){flatData[grandchild]=daapiItem[child][grandchild];}}}}}
return flatData;},processTemplate:function(dataObj,template){var regex,template,matches,matchIdx,theMatch,varName;regex=/\@Nyx\.[^\@]+\@/g;matches=template.match(regex);if(matches!==null){for(matchIdx=0;matchIdx<matches.length;matchIdx++){theMatch=matches[matchIdx];varName=theMatch.substring(5,theMatch.length-1);if(typeof dataObj[varName]!="undefined"){template=NYX.util.string.replaceAll(template,theMatch,dataObj[varName]);}}}
return template;},applyAltClasses:function(itemIndex,template){var className,templateVariable;templateVariable="@Nyx.AlternateClass@";if(template.indexOf(templateVariable)>-1){className=" ";if((itemIndex+1)%2===0){className+=this.ALT_CLASS_2+" ";}
if((itemIndex+1)%3===0){className+=this.ALT_CLASS_3+" ";}
template=NYX.util.string.replaceAll(template,templateVariable,className);}
return template;},showTarget:function(domTarget){var waitingMsgElem=this.getElem(this.DOM_WAITMSG_SUFFIX);if(waitingMsgElem!==null){waitingMsgElem.style.display="none";}
if(domTarget!==null){domTarget.style.display="";}}};function requestPluckUserAvatar(){var requestBatch=new RequestBatch();var currentUser=retrieveSSOCookieUserId();if(currentUser!==''&&currentUser!='undefined'){currentUser=hex_md5(currentUser);}
var userKey=new UserKey(currentUser);requestBatch.AddToRequest(userKey);requestBatch.BeginRequest(serverUrl,renderUserAvatar);}
function renderUserAvatar(responseBatch){var user=retrieveSSOCookieUserId();console.log('user = '+retrieveSSOCookieUserId());if(user===null){}else{var user=responseBatch.Responses[0].User;var avatar=document.createElement('a');avatar.href='/personas?plckUserId='+user.UserKey.Key+'&insiteUserId='+user.UserKey.Key;var genericAvatar=document.getElementById("avatar");var newImg=genericAvatar.cloneNode();newImg.src=user.AvatarPhotoUrl;avatar.appendChild(newImg);genericAvatar.replaceChild(avatar,genericAvatar);}}
NYX.CurrentUser=function(idRoot){NYX.util.obj.extend(this,NYX.TemplateTool);this.idRoot=idRoot;this.userTemplate="";this.guestTemplate="";this.prepareData=function(user){var dataObj=this.flattenDaapiItem(user);return dataObj;};this.writeGui=function(user){var flatUser,targetElem;flatUser=this.prepareData(user);targetElem=this.getElem(this.DOM_TARGET_SUFFIX);if(targetElem!==null){this.initGui(targetElem);if(user.UserTier.toLowerCase()=="anonymous"||gSiteLife.mi.userLoggedIn()===false){targetElem.innerHTML=this.processTemplate(flatUser,this.guestTemplate);}else{targetElem.innerHTML=this.processTemplate(flatUser,this.userTemplate);}
this.finishGui(targetElem);this.showTarget(targetElem);}};this.initGui=function(domTarget){return true;};this.finishGui=function(domTarget){return true;};};NYX.DiscoWriter=function(idRoot,itemTemplate){NYX.util.obj.extend(this,NYX.TemplateTool);this.idRoot=idRoot;if(typeof template=="string"){this.template=template;}
else{template="@Nyx.PageTitle@";}
this.discoLimit=99;this.untitledText="Untitled";this.unnamedSection="";this.categoryJoin=", ";this.discoContent=[];this.prepareData=function(discoItem){var dataObj=this.flattenDaapiItem(discoItem);if(typeof discoItem.Categories=="object"){dataObj.Categories="";for(var catIdx=0;catIdx<discoItem.Categories.length;catIdx++){dataObj.Categories+=discoItem.Categories[catIdx].Name+this.categoryJoin;}
if(catIdx>0){dataObj.Categories=dataObj.Categories.substring(0,dataObj.Categories.length-this.categoryJoin.length);}}
if(typeof dataObj.PageTitle!="undefined"){if(NYX.util.string.isBlank(dataObj.PageTitle)){dataObj.PageTitle=this.untitledText;}}
if(discoItem.Section===null){dataObj.Section=this.unnamedSection;}else if(typeof discoItem.Section!="undefined"){if(NYX.util.string.isBlank(discoItem.Section.Name)){dataObj.Section=this.unnamedSection;}
else{dataObj.Section=discoItem.Section.Name;}}
return dataObj;};this.writeGui=function(daapiResponse){this.discoContent=daapiResponse;var discoData,itemIdx,loopLimit,html,targetElem;targetElem=this.getElem(this.DOM_TARGET_SUFFIX);if(targetElem!==null){this.initGui();loopLimit=this.discoContent.length<this.discoLimit?this.discoContent.length:this.discoLimit;for(itemIdx=0;itemIdx<loopLimit;itemIdx++){discoData=this.prepareData(this.discoContent[itemIdx]);discoData.PageUrl=(typeof mi!='undefined'&&mi.mobile==true)?discoData.PageUrl.replace(/\/story\//,"/v-mobile/story/"):discoData.PageUrl;switch(this.idRoot){case'RecDiscOutput':discoData.PageUrl+='?storylink=pluck_recommended';break;case'ComDiscOutput':discoData.PageUrl+='?storylink=pluck_commented';break;}
html=this.processTemplate(discoData,this.template);html=this.customizeItem(discoData,html,targetElem,itemIdx);targetElem.innerHTML+=html;}
this.finishGui();this.showTarget(targetElem);}};this.initGui=function(){return true;};this.finishGui=function(){return true;};this.customizeItem=function(dataObj,itemHtml,domElemThisWritesTo,itemIndex){return itemHtml;};};function makeDiscoRequest(actype){var sections=[new Section("All")];var categories=[new Category("All")];var activity=new Activity(actype);var contentType=new ContentType("Article");var tiersToAllow=[new UserTier("All")];var contentAgeLimit=15;var maxToReturn=10;var discoveryAction=new DiscoverContentAction(sections,categories,tiersToAllow,activity,contentType,contentAgeLimit,maxToReturn,true);return discoveryAction;}
function daapiCallback(responseBatch){NYX.fixConsole();console.dir(responseBatch);if(typeof responseBatch.Responses[0]!="object"||typeof responseBatch.Responses[0].DiscoverContentAction!="object"){alert("Invalid response -- see the Firebug console (if you have one) to see what happened");}else{myGadgetCom.writeGui(responseBatch.Responses[0].DiscoverContentAction.DiscoveredContent);myGadgetRec.writeGui(responseBatch.Responses[1].DiscoverContentAction.DiscoveredContent);myGadgetAva.writeGui(responseBatch.Responses[2].User);}}
var myGadgetCom=new NYX.DiscoWriter("ComDiscOutput");myGadgetCom.discoLimit=10;myGadgetCom.unnamedSection="none";var myGadgetRec=new NYX.DiscoWriter("RecDiscOutput");myGadgetRec.discoLimit=10;myGadgetRec.unnamedSection="none";var myGadgetAva=new NYX.CurrentUser("AvatarOutput");var requestBatch=new RequestBatch();requestBatch.AddToRequest(makeDiscoRequest("Commented"));requestBatch.AddToRequest(makeDiscoRequest("Recommended"));requestBatch.AddToRequest(new UserKey());function pluckShowHide(hideID,showID){document.getElementById(hideID).style.display="none";document.getElementById(showID).style.display="block";}
var switchThumbnails='';function convertPopularLinks(){$("#mostPopular ul li a").each(function(){originalHREF=$(this).attr('href');spliturl=originalHREF.split('/');newHREF=spliturl[0]+"/"+spliturl[1]+"/"+spliturl[2]+"/"+spliturl[3]+"/"+spliturl[4]+"/"+spliturl[5]+"/v-mobile/"+spliturl[6]+"/"+spliturl[7];$(this).attr('href',newHREF);});}
function initAccordion()
{currentURL=window.location.href;if(currentURL.match("mobile_channels")){$("li.channel").show();$("ul#mostPopularFeeds").hide();}else{tmpChannelList=readCookie("mobileChannelList").split('|');var lastChannelListID=''
if(tmpChannelList){for(i in tmpChannelList){$("#c"+tmpChannelList[i]).css("display","block");lastChannelListID="#c"+tmpChannelList[i];}}}
positionCount=0;lastLiBlock=0;$("div#homePageChannels ul li.channel").each(function(){positionCount++;if($(this).css('display').match('block'))
lastLiBlock=positionCount;});lastLiBlock--;$('div#homePageChannels ul li.channel:eq('+lastLiBlock+')').css('-webkit-border-bottom-right-radius','10px');$('div#homePageChannels ul li.channel:eq('+lastLiBlock+')').css('-webkit-border-bottom-left-radius','10px');$('div#homePageChannels ul li.channel:eq('+lastLiBlock+') li.story:last-child').css('-webkit-border-bottom-left-radius','10px');$('.channel h2').click(function(){var checkElement=$(this).next();if($(checkElement).attr('id').match('ComDiscTemplate')||$(checkElement).attr('id').match('RecDiscTemplate')){checkElement=$(checkElement).next();}
$('.channel h2').removeClass('arrowDown');$('.channel h2').addClass('arrowLeft');if((checkElement.is('ul'))&&(checkElement.is(':visible'))){checkElement.hide();return false;}
if((checkElement.is('ul'))&&(!checkElement.is(':visible'))){testInitialExpansion=$(this).attr('class');if(testInitialExpansion.match('neverExpanded')){tmpSectionID=$(this).attr('id').split('h2');liSectionID="li#c"+tmpSectionID[1];sectionID="mi"+tmpSectionID[1];atomURL='/'+tmpSectionID[1]+'/index.atom';$(liSectionID+" .moreStories").hide();$(liSectionID+" h2").append("<span class='h2LoadingText'> <span class='ajaxLoadTop'</span></span>");$(liSectionID+" h2 span.ajaxLoadTop").css("background-image",'url(/static/images/mi/smartphone/ajaxLoad.gif)');fetchStories(0,5,atomURL,sectionID);$(this).removeClass('neverExpanded');}
$('.channel ul:visible').hide();$(this).removeClass('arrowLeft');$(this).addClass('arrowDown');checkElement.show();return false;}});}
addEventListener("load",function(){setTimeout(hideURLbar,0);},false);function hideURLbar(){window.scrollTo(0,1);}
function fetchStories(start,end,url,cssID){var loopCount=0;var elementCount=0;var outputStories="";$.ajax({type:"GET",url:url,async:true,success:function(xml){$('entry',xml).each(function(i){loopCount++;if((loopCount>start)&&(elementCount<end)){var headline=$(this).find("title").text();var url=$(this).find("link[ type='text\/html' ]").attr('href');var dateUpdated=$(this).find("updated").text();var datePublished=$(this).find("published ").text();var image=$(this).find("img.mobileThumb").attr('src');var imageAlt=$(this).find("img").attr('alt');var	summary=$(this).find("p.body").html();if(summary){tmpSummary=summary.split('<![CDATA[');summary=tmpSummary[1].split(']]>');summary=summary[0];}else{summary='';}
var spliturl=url.split("/");url=spliturl[0]+"/"+spliturl[1]+"/"+spliturl[2]+"/"+spliturl[3]+"/"+spliturl[4]+"/"+spliturl[5]+"/v-mobile/"+spliturl[6]+"/"+spliturl[7];if(!image)
image='/static/styles/smartphone/themes/mi_theme/images/image-bkgd.png';image=encodeURI(image);outputStories+="\
								<li class='story newStory'>\
								    <span class='moreStoryHighlight'></span>\
								    <div class='image' style='background-image: url("+image+");'>\
								        <span class='overlay'></span>\
								    </div>\
								    <div class='summary'>\
								        <p class='headline'>\
				        				    <a href='"+url+"' >\
												"+headline+"\
											</a>\
										</p>\
										<p class='secondary'>\
											<a href='"+url+"' >\
												"+summary+"\
											</a>\
										</p>\
									</div>\
								</li>";elementCount++;}else if(elementCount>end){return(false);}});$(liSectionID+" .moreStories").show();if((elementCount==0)||(elementCount<end)){$("#"+cssID+" li.moreStories").css("display","none");headingCssSelector=cssID.split("mi");$("#h2"+headingCssSelector[1]).append("(No more stories)");$("#h2"+headingCssSelector[1]).addClass("noMoreStories");}
if(elementCount!=0)
$("#"+cssID+" li.story p.secondary").css("display","none");$("#"+cssID+" li").removeClass('newStory');$("#"+cssID+" li.moreStories").before(outputStories);$("ul#"+cssID+" li.moreStories span.ajaxLoad").css("background-image",'none');$("span.h2LoadingText").remove();},error:function(xhr,desc,exceptionobj){$("ul#"+cssID+" li.moreStories span.ajaxLoad").css("background-image",'none');$("span.h2LoadingText").remove();alert("Error fetching news feed");}});}
function fetchStoriesJSON(start,end,url,cssID){var loopCount=0;var elementCount=0;var outputStories="";$.getJSON("/static/scripts/smartphone/tmp/feed.json?test=1&jsoncallback=jsonCallbackTest",function(json){alert("TEST");$.each(json.items,function(){});});}
function preFetchStories(url,ulCssID,end){var startStory=$("ul#"+ulCssID+" li").size();$("ul#"+ulCssID+" li.moreStories span.ajaxLoad").css("background-image",'url(/static/images/mi/smartphone/ajaxLoad.gif)');setTimeout(function(){fetchStories(startStory,end,url,ulCssID);},300);}
function isAppleDevice(){userAgent=navigator.userAgent;userAgent=userAgent.toLowerCase();if(userAgent.match('iphone')||userAgent.match('ipod'))
return(true);else
return(false);}
function orientationChange(){var currentOrientation=window.orientation;var orient=currentOrientation==0?"portrait":"landscape";document.body.setAttribute("orient",orient);hideURLbar();}
var isSearchDisplayed=0;function searchDisplay(){if(isSearchDisplayed==0){if(isLoginDisplayed==1){$("#insiteLogin").hide();hideURLbar();isLoginDisplayed=0;}
$("#simpleSearch").show();isSearchDisplayed=1;}else{$("#simpleSearch").hide();hideURLbar();isSearchDisplayed=0;}}
var isLoginDisplayed=0;function loginDisplay(){if(isLoginDisplayed==0){if(isSearchDisplayed==1){$("#simpleSearch").hide();hideURLbar();isSearchDisplayed=0;}
$("#insiteLogin").show();isLoginDisplayed=1;}else{$("#insiteLogin").hide();hideURLbar();isLoginDisplayed=0;}}
var isMainMenuDisplayed=0;function mainMenuDisplay(){if(isMainMenuDisplayed==0){if(isSearchDisplayed==1){$("#simpleSearch").hide();hideURLbar();isSearchDisplayed=0;}
wrapperHeight=$("#wrap").css('height');wrapperHeight=wrapperHeight.split('px');wrapperHeight[0]-=20;wrapperHeight=wrapperHeight[0]+"px";$(".menuOpacity").css('height',wrapperHeight);$("#mainMenu").show();isMainMenuDisplayed=1;}else{$("#mainMenu").hide();hideURLbar();isMainMenuDisplayed=0;}}
function processLogin(){$.post("/reg-bin/int.cgi",{mode:$("#insiteHiddenMode").val(),version:$("#insiteHiddenVersion").val(),rurl:$("#insiteHiddenRurl").val(),error_url:$("#insiteHiddenErrorUrl").val(),user_name:$("#insiteTextUsername").val(),password:$("#insitePasswordPassword").val(),remember:$("#insiteCheckboxRemember").val()},function(msg){if(msg.match("insiteLoginError")){alert("Incorrect Username or Password. Please retry.");$("#insitePasswordPassword").val('');$("#insiteTextUsername").focus();}else{alert("Thank you for logging in, the page will now refresh.");window.location=window.location.href;}});}
function storyTextBig(){var initialFontSize=$("#storyBody p").css('font-size');tmpInitialFontSize=initialFontSize.split("px");if(tmpInitialFontSize[0]<20){initialFontSize=++tmpInitialFontSize[0]+"px";$("#storyBody p").css('font-size',initialFontSize);$("#storyTextSmall").css("color","white");createCookie("mobileStoryTextSize",initialFontSize,365);}else{$("#storyTextBig").css("color","grey");$("#storyTextSmall").css("color","white");}}
function storyTextSmall(){var initialFontSize=$("#storyBody p").css('font-size');tmpInitialFontSize=initialFontSize.split("px");if(tmpInitialFontSize[0]>10){initialFontSize=--tmpInitialFontSize[0]+"px";$("#storyBody p").css('font-size',initialFontSize);$("#storyTextBig").css("color","white");createCookie("mobileStoryTextSize",initialFontSize,365);}else{$("#storyTextSmall").css("color","grey");$("#storyTextBig").css("color","white");}}
var isCommentsDisplayed=0;function toggleComments(){if(isCommentsDisplayed==0){$("#storyBody").hide();$("#storyTools").hide();if(!isUserLoggedIn()){$("#SiteLife_Login").html('\
				Please <a href="#" onClick="mainMenuDisplay(); loginDisplay(); return( false );"> login </a>\
				to leave comments.  If you are not registered, please register on our full site\
				<a href="/reg-bin/int.cgi?mode=register&goto='+window.location.href+'"> here </a>\
			');}else{$("#SiteLife_Login").html('');}
$(".comWrapper").show();isCommentsDisplayed=1;}else{$("#storyBody").show();$("#storyTools").show();$(".comWrapper").hide();isCommentsDisplayed=0;}}
function settingsToggleInitialization(){if(readCookie('mobileVideoPreview')){$("#mobileVideoPreview").removeClass("iToggleOff");$("#mobileVideoPreview").addClass("iToggleOn");}
getSettingsCookie=readCookie("mobileChannelList");if(getSettingsCookie){activeChannels=getSettingsCookie.split('|');for(i in activeChannels){$("#"+activeChannels[i]).removeClass("iToggleOff");$("#"+activeChannels[i]).addClass("iToggleOn");}}}
function settingsToggle(state,id){channelList=readCookie("mobileChannelList");if(state=="true"){if(channelList){channelList+="|"+id;createCookie("mobileChannelList",channelList,365);}else{createCookie("mobileChannelList",id,365);}
}else{if(channelList){splitChannelList=channelList.split(id+"|");if(splitChannelList[1]==undefined){splitChannelList=channelList.split("|"+id);}
if(splitChannelList[1]!=undefined){modifiedChannelList=splitChannelList[0]+splitChannelList[1];createCookie("mobileChannelList",modifiedChannelList,365);}else{alert("Must leave atleast one channel active");$("#"+id).removeClass("iToggleOff").addClass("iToggleOn");}
}else{}}
channelList=readCookie("mobileChannelList");}
function channelListCookieInitialization(){testChannelList=readCookie("mobileChannelList");channelList='';if(testChannelList){}else{for(i in miDefaultHomePageSectionList){channelList=channelList+miDefaultHomePageSectionList[i]+"|";}
channelList=channelList.replace(/\|$/,'');createCookie("mobileChannelList",channelList,365);}}
function createCookie(name,value,days){if(days){var date=new Date();date.setTime(date.getTime()+(days*24*60*60*1000));var expires="; expires="+date.toGMTString();}
else var expires="";document.cookie=name+"="+value+expires+"; domain="+cookieDomain+"; path=/";}
function readCookie(name){var nameEQ=name+"=";var ca=document.cookie.split(';');for(var i=0;i<ca.length;i++){var c=ca[i];while(c.charAt(0)==' ')c=c.substring(1,c.length);if(c.indexOf(nameEQ)==0)return c.substring(nameEQ.length,c.length);}
return null;}
function eraseCookie(name){createCookie(name,"",-1);}
function isUserLoggedIn(){insiteCookie=readCookie(insiteUserAuthCookieName);if(insiteCookie){insiteCookie=insiteCookie.split('%7');return(insiteCookie[0]);}else{return(false);}}
function hideVideos(){$(".videoChannel").hide();positionCount=0;lastLiBlock=0;$("ul#mostPopularFeeds li").each(function(){positionCount++;if($(this).css('display').match('block'))
lastLiBlock=positionCount;});lastLiBlock=lastLiBlock-1;$('ul#mostPopularFeeds li.channel:eq('+lastLiBlock+')').css('-webkit-border-bottom-right-radius','10px');$('ul#mostPopularFeeds li.channel:eq('+lastLiBlock+')').css('-webkit-border-bottom-left-radius','10px');}
function processLogout(){eraseCookie(insiteUserAuthCookieName);eraseCookie('vmix_core_user_info');eraseCookie('AT');$("li.menuLogin a").text("Login");$("li.menuLogin").removeClass("menuLogout");$("li.menuLogin").addClass("menuLogon");$("li.menuLogin a").attr('onClick','loginDisplay(); return( false )');alert('You have been successfully logged out');mainMenuDisplay();}
$(document).ready(function(){windowHREF=window.location.href;if(isUserLoggedIn()){$("li.menuLogin a").text("Log Out");$("li.menuLogin").removeClass("menuLogon");$("li.menuLogin").addClass("menuLogout");$("li.menuLogin a").attr('onClick','processLogout(); return( false )');}else{}
$("div.iToggle").click(function(){buttonState=$(this).attr('class');sectionID=$(this).attr('id');if(buttonState.match("iToggleOn")){buttonState='false';$(this).removeClass("iToggleOn").addClass("iToggleOff");}else{buttonState='true';$(this).removeClass("iToggleOff").addClass("iToggleOn");}
if((sectionID=='mobileVideoPreview')&&(buttonState=='true'))
createCookie('mobileVideoPreview','1',365);else if((sectionID=='mobileVideoPreview')&&(buttonState=='false'))
eraseCookie('mobileVideoPreview');else
settingsToggle(buttonState,sectionID);});$("#simpleSearchText").focus(function(){$(this).attr('value','');});if(isAppleDevice()){$("li.videoChannel ul li").click(function(){currentVideoCssID=$(this).attr('id');currentVideoID=currentVideoCssID.split('-');currentVideoID=currentVideoID[1];if(readCookie('mobileVideoPreview')){window.clearInterval(switchThumbnails);$("ul#miVideo div.image").show();$("ul#miVideo div.summary").show();$("#"+currentVideoCssID+" div.image").hide();$("#"+currentVideoCssID+" div.summary").hide();isVisible=$("#"+currentVideoCssID+" .thumbnailPreview").css('display');if(isVisible=='none'){}else{window.location=$("#"+currentVideoCssID+" a.videoPlayURL-MP4").attr('href');}
$("div.thumbnailPreview").hide();thumbnailUrlList=[];loopCount=0;$("#"+currentVideoCssID+" div.thumbnailPreview input").each(function(){thumbnailUrlList[loopCount]=$(this).val();loopCount++;});$("#"+currentVideoCssID+" div.thumbnailPreview div.vmixThumbnailPreview img.thumbnailCurrent").attr('src',thumbnailUrlList[0]);$("#"+currentVideoCssID+" div.thumbnailPreview div.vmixThumbnailPreview img.thumbnailOnDeck").attr('src',thumbnailUrlList[1]);$("#"+currentVideoCssID+" div.thumbnailPreview div.vmixThumbnailPreview img.thumbnailThird").attr('src',thumbnailUrlList[2]);$("#"+currentVideoCssID+" .thumbnailPreview").show();imageSwitch=3;switchThumbnails=window.setInterval(function(){$("#"+currentVideoCssID+" div.thumbnailPreview div.vmixThumbnailPreview img.thumbnailThird")
.addClass("awaitingThumbnailClass")
.removeClass("thumbnailThird");$("#"+currentVideoCssID+" div.thumbnailPreview div.vmixThumbnailPreview img.thumbnailCurrent")
.addClass('thumbnailThird')
.removeClass('thumbnailCurrent');$("#"+currentVideoCssID+" div.thumbnailPreview div.vmixThumbnailPreview img.thumbnailOnDeck")
.addClass('thumbnailCurrent')
.removeClass('thumbnailOnDeck');$("#"+currentVideoCssID+" div.thumbnailPreview div.vmixThumbnailPreview img.awaitingThumbnailClass")
.addClass('thumbnailOnDeck')
.removeClass('awaitingThumbnailClass');$("#"+currentVideoCssID+" div.thumbnailPreview div.vmixThumbnailPreview img.thumbnailThird").attr('src',thumbnailUrlList[imageSwitch]);imageSwitch++;},1700);}else{window.location=$("#"+currentVideoCssID+" a.videoPlayURL-MP4").attr('href');}});}else{}
if(windowHREF.match('galleries')||windowHREF.match('gallery')){}
if(windowHREF.match('story')){$("#story_comments_count a").click(function(){toggleComments();return(false);});tmpStoryCookie=readCookie('mobileStoryTextSize');if(tmpStoryCookie){$("#storyBody p").css('font-size',tmpStoryCookie);}
if(windowHREF.match('Comments_Container')){toggleComments();}}
});var isThemeSwitched=0;function switchTheme(themeName){if(isThemeSwitched==0){$("body").addClass(themeName);isThemeSwitched=1;mainMenuDisplay();}else{$("body").removeClass(themeName);isThemeSwitched=0;mainMenuDisplay();}}
var mouseDownX;var mouseUpX;function experimentalFlick(){document.addEventListener('touchstart',touchHandler,false);document.addEventListener('touchmove',touchHandler,false);document.addEventListener('touchend',touchHandler,false);document.addEventListener('touchcancel',touchHandler,false);function touchHandler(e){var touch=e.touches[0];e.preventDefault();if(e.type=="touchstart"){$("#galleryImageCurrentCaption").html("TOUCH START: "+touch.pageX);mouseDownX=touch.pageX;}
else if(e.type=="touchmove"){e.preventDefault();if((mouseDownX-touch.pageX)<-50){$("#galleryImageCurrentCaption").html("SWIPE RIGHT: "+(mouseDownX-touch.pageX));}else if((mouseDownX-touch.pageX)>50){$("#galleryImageCurrentCaption").html("SWIPE LEFT: "+(mouseDownX-touch.pageX));}
}
else if(e.type=="touchend"||e.type=="touchcancel"){$("#galleryImageCurrentCaption").html("TOUCH CANCEL: "+touch.pageX);mouseUpX=touch.pageX;$("img#currentImage").addClass("slideMeRight");}}
}
function trackChannelExpansion(){$('.channel h2').click(function(){currentID=$(this).attr('id');if(currentID=="h2MostRecommended"){pageTracker._trackEvent("Mobile","Channel Expansion","Most Recommended");}else if(currentID=="h2MostCommented"){pageTracker._trackEvent("Mobile","Channel Expansion","Most Commented");}else if(currentID=="h2MostPopular"){pageTracker._trackEvent("Mobile","Channel Expansion","Most Popular");}else if(currentID=="h2Video"){pageTracker._trackEvent("Mobile","Channel Expansion","Video");}else{sectionID=$(this).attr('id').split('h2');sectionTitle=$(this).attr('title');pageTracker._trackEvent("Mobile","Channel Expansion","Section - "+sectionTitle+"( "+sectionID+" )");}});}
function trackMoreStories(){$('.fetchMoreStories').click(function(){sectionID=$(this).attr('id').split('moreStories');sectionTitle=$(this).attr('title');pageTracker._trackEvent("Mobile","Fetch More Stories",sectionTitle+"( "+sectionID[1]+" )");});}
function trackSettingsToggle(){$('.iToggle').click(function(){sectionTitle=$(this).attr('title');if($(this).attr('class').match('iToggleOn'))
pageTracker._trackEvent("Mobile","Settings - Toggle Off",sectionTitle+"( "+$(this).attr('id')+" )");if($(this).attr('class').match('iToggleOff'))
pageTracker._trackEvent("Mobile","Settings - Toggle On",sectionTitle+"( "+$(this).attr('id')+" )");});}
function trackTopStoryClick(){$('.topStoryLink').click(function(){pageTracker._trackEvent("Mobile","Top Story Click");});}
function trackVideoPlay(){$("li.videoChannel ul li").click(function(){pageTracker._trackEvent("Mobile","Video Play");});}
function trackStoryCommentsView(){$("#storyComments").click(function(){pageTracker._trackEvent("Mobile","Story","Comments View");});}
function trackStoryRecommendation(){$("span#recommendation a").click(function(){pageTracker._trackEvent("Mobile","Story","Recommendation");});}
function trackMenuOpen(){$('#menuLink').click(function(){pageTracker._trackEvent("Mobile","Menu","Open");});}
function trackStoryMenuEmail(){$("#emailStory").click(function(){pageTracker._trackEvent("Mobile","Menu","Email Story");});}
function trackStoryMenuTextIncrease(){$("#storyTextBig").click(function(){pageTracker._trackEvent("Mobile","Menu","Text Increase");});}
function trackStoryMenuTextDecrease(){$("#storyTextSmall").click(function(){pageTracker._trackEvent("Mobile","Menu","Text Decrease");});}
function trackMenuLoginClick(){$(".menuLogin a").click(function(){pageTracker._trackEvent("Mobile","Menu","Login");});}
function trackMenuHomeClick(){$(".menuHome a").click(function(){pageTracker._trackEvent("Mobile","Menu","Home");});}
function trackMenuChannelsClick(){$(".menuChannels a").click(function(){pageTracker._trackEvent("Mobile","Menu","Channels");});}
function trackMenuGalleriesClick(){$(".menuGalleries a").click(function(){pageTracker._trackEvent("Mobile","Menu","Galleries");});}
function trackMenuSettingsClick(){$(".menuSettings a").click(function(){pageTracker._trackEvent("Mobile","Menu","Settings");});}
function trackMenuFullClick(){$(".menuFull a").click(function(){pageTracker._trackEvent("Mobile","Menu","Full Site");});}
function trackMenuCloseClick(){$(".menuClose a").click(function(){pageTracker._trackEvent("Mobile","Menu","Close Menu");});}
function initiateEventTracking(){trackChannelExpansion();trackMoreStories();trackSettingsToggle();trackTopStoryClick();trackVideoPlay();trackStoryCommentsView();trackStoryRecommendation();trackMenuOpen();trackStoryMenuEmail();trackStoryMenuTextIncrease();trackStoryMenuTextDecrease();trackMenuLoginClick();trackMenuHomeClick();trackMenuChannelsClick();trackMenuGalleriesClick();trackMenuSettingsClick();trackMenuFullClick();trackMenuCloseClick();}