// onverse javascript compiled Tue Feb 23 19:17:09 2010 GMT



// source: ../www.onverse.com/Website/web/js/onverse/loadIndicator.js


var LoadIndicator = Class.extend({
	
	// *** Constructors ***
	init: function() {
	},
	
	// *** Properties ***
	
	// number of active downloads
	downloadCount: 0,	
	// current downloads
	downloads: {},
	// how long to wait before showing load message (in ms)
	pauseTime: 1500,
	// how long to wait for a timeout
	timeout: 5000,
	
	// *** Methods ***
	
	// Monitors the progress of a function
	//	args:
	//		run 		- function to execute
	//		text 		- text to display to user when referring to this operation
	//		onComplete 	- code to execute after args.run(), on both timeout and success
	//		onTimeout 	- code to run if the download times out 
	//		key 		- prefered key to use (optional)
	//
	monitor: function(args) {	
		if (!args) args = {};
		var me = this;
		args.key = this._makeUnique(args.key);				
		args.finished = function() {
			me.downloadFinished(args.key);
			gently(args.onComplete);
		};
		args.key = this.downloadStarted(args.key, args.text, function() { args.onTimeout(); args.onComplete(); });
		gently(args.run);
		return args;
	},
	
	
	downloadStarted: function(key, msg, timeoutCallback) {		
		key = this._makeUnique(key);
		if (!msg) msg = 'Key: ' + key;		
		this.downloadCount++;		
		this.downloads[key] = { text: msg, startTime: new Date().getTime() };
		this._update(key, timeoutCallback);			
		//log('Download started - ' + key + '(' + msg + ') - ' + new Date().getTime());
		return key;
	},
	downloadFinished: function(key) {
		var dl = this.downloads[key];
		if (dl) {	
			dl.endTime = new Date().getTime();				
			log('Download finished - ' + dl.text + ' - duration = ' + (dl.endTime - dl.startTime)) + 'ms';
		}
		
		this.downloadCount--;
 		if (key) delete this.downloads[key];
		if (this.downloadCount == 0) this.downloads = {};
		this._update(key);
	},
	downloadTimeout: function(key) {
		log('Download timeout - ' + key + ' - ' + new Date().getTime());
//		alert('Timeout - ' + this.downloads[key]);
	},
	_makeUnique: function(key) {
		if (!key) key = String(Math.random()).substring(3);
		if (this.downloads[key]) key += '_' + String(Math.random()).substring(3);
		return key;		
	},
	_update: function(key, timeoutCallback) {
		if (!this.jq) {
			this.jq = $('#loading');
		}
		var me = this;
		var displayThread = function() {
			if (me.downloadCount > 0) {
			    if (me.downloads[key]) {
				    me.jq.text(me.downloads[key].text + '...');
				}
				me.jq.slideDown() 
			}
			else {
				// lag a bit before closing.
				setTimeout(function() { 
					if (me.downloadCount < 1) {
						me.jq.slideUp();
					}
				}, 250);				
			}
        };
		var timeoutThread = function() {
			if (key) {
				if (me.downloads[key]) {
					me.downloadFinished(key);
					if (timeoutCallback) {
						timeoutCallback();
					}
					else {
						me.downloadTimeout(key);					
					}
				}
			}
		};
		setTimeout(displayThread, this.pauseTime);
		setTimeout(timeoutThread, this.timeout);
	}
});
var loadIndicator = new LoadIndicator();





// source: ../www.onverse.com/Website/web/js/onverse/onverse.js

//
// Title: Main Onverse Application
// File: onverse.js
// Author: Scott Mitting
// Date: 2009-02-08
// Abstract:
//	Main javascript objects for the onverse website.
//

var showAnimations = false;

// maps photo IDs to urls
var photomap = {
    emoticon: function(icon) {
        return '/web/css/gfx/emoticons/' + icon;
    },
    fullsizeUrl: function(url) {
        if (url == '') return '/web/css/gfx/default-profile.jpg';    
        return String.format('/json/photos/.ashx/photo/{0}', url);
    },
    thumbnailUrl: function(url) {
        return String.format('/json/photos/.ashx/thumb/{0}', url);
    },
    profilethumbUrl: function(url) {
        if (url == '') return '/web/css/gfx/default-profile.jpg';    
        return String.format('/json/photos/.ashx/profile/{0}', url);
    },
    _baseUrl: ''
};

// attempt to auto-register ajax calls with the load indicator
function ajax(text, type, method, data, cb) {
	var download = loadIndicator.monitor({
		text: text,
		run: function() {				
			$.ajax({ 
			    cache: false,
				url: '/json/.ashx/' + type + '/' + method,  // iis compatibility
				//url: '/json/' + type + '/' + method, 
				dataType: 'json',
				type: 'POST',
				data: data,
				success: function(res) {
					download.finished();
					if (!res.success) {
						reportError(download.text, res.error.message); 
					}			
					cb(res);						
				},
				error: function(xhr, status, error) {
					download.finished();
					cb(null);						
				}
			});
		},
		onTimeout: function() {},
		onComplete: function() {}
	});	
}

// attempt to auto-register html downloads with the load indicator
function ajaxWidget(text, url, cb) {
	var download = loadIndicator.monitor({
		text: text,		
		run: function() {				
			$.ajax({ url: url, 
			    dataType: 'html', 
			    cache: false,
				success: function(html) {
					download.finished();
					if (cb) { cb(html); }
				},
				error: function(xhr, status, error) {
					download.finished();
					try { reportError(download.text, res.error.message); } catch (ex) {}
				}
			});
		},
		onTimeout: function() {},
		onComplete: function() {}
	});	
}

// attempt to auto-register js downloads with the load indicator
function ajaxScript(text, url, cb) {
	var download = loadIndicator.monitor({
		text: text,
		run: function() {				
			$.ajax({ url: url,
			    dataType: 'script',
				cache: false,
				success: function(js) {
					download.finished();
					cb(js);
				},
				error: function(xhr, status, error) {
					download.finished();
					try { reportError(download.text, res.error.message); } catch (ex) {}
				}
			});
		},
		onTimeout: function() {},
		onComplete: function() {}
	});	
}



// Main Application Object
var OnverseApp = Class.extend({

    // *** Properties ***

    // current logged in user
    username: null,
    // profile for the current user
    userProfile: null,
    // username of selected friend profile
    profileUsername: null,
    // user profile data being viewed
    profile: null,
    // has checkLogin() been called?
    _loginChecked: false,

    // *** Methods ***	

    // constructor
    init: function() {
        // speed optimization
        this.jq_left = $('#left');
        this.jq_main = $('#main');
        this.jq_right = $('#right');
        // site layout containers	
        this.leftPane = new WidgetContainer('left');
        this.mainPane = new WidgetContainer('main');
        this.loginPane = new WidgetContainer('login');
        this.rightPane = new WidgetContainer('right');
        // display
        this.checkLogin();
    },
    // erases all local variables
    clear: function() {
        OnverseApp.AsyncData.resetAll();
        this.username = null;
        this.profile = null;
        this.profileUsername = null;
    },
    // gets the current logged-in user and refreshes the screen to reflect this
    checkLogin: function(doredirect) {
        var me = this;
        var shouldBeUsername = this.username;
        OnverseApp.AsyncData.binding.currentLogin.reset();
        OnverseApp.AsyncData.currentLogin(function(res) {
            if (res.value != null && shouldBeUsername == null) {
                shouldBeUsername = res.value;
            }
            $('#find_friends').css({ 'visibility': res.value ? 'visible' : 'hidden' });
            //$('#downloadLink').css({ 'visibility': res.value ? 'visible' : 'hidden' });
            if (res.value != null && shouldBeUsername == res.value) {
                me.username = res.value;
                if (doredirect) {
                    document.location = '/my/profile.html';
                }
            }
            else {
                me.clear();
            }
            me.loginPane.set(OnverseApp.GUI.Login);
            me.loginPane.show({ username: me.username });
            //me.bindData();
        });
    },
    // loads the current user's profile
    loadMyProfile: function() {
        document.location = '' + document.location;

        /*
        if (this.username == null) return;
        var me = this;
        OnverseApp.AsyncData.binding.myProfile.reset();
        OnverseApp.AsyncData.myProfile(function(res) {
        if (res && res.success) {
        me.userProfile = res.value;
        if (OnverseApp.MenuTabs.currentTab == 'Signin') {
        OnverseApp.MenuTabs.setMenu('Home', 'About');
        }
        }
        me.bindData();
        });*/
    },

    // loads the current user's profile
    reloadProfile: function() {
        document.location = '' + document.location;
    },

    // loads a user profile
    loadProfile: function(id) {
        if (id != null) this.profileUsername = id;
        if (this.profileUsername == null) return;
        var me = this;
        OnverseApp.AsyncData.binding.friendProfile.reset();
        OnverseApp.AsyncData.friendProfile(function(res) {
            if (res && res.success) {
                me.profile = res.value;
                OnverseApp.MenuTabs.setMenu('My', 'FriendProfile');
            }
            else {
                OnverseApp.MenuTabs.setMenu('My');
            }
            me.bindData();
        });
    },

    getUnreadMessageCount: function() {
        return app.userProfile ? app.userProfile.unreadCount : 0;
    },

    decrementUnreadMessageCount: function() {
        app.userProfile.unreadCount--;
    },

    getFriendRequestCount: function() {
        return app.userProfile ? app.userProfile.friendRequestCount : 0;
    },

    // Opens a window
    openWindow: function(url, args, callback) {
        ajaxWidget('Opening Window', url,
            function(html) {
                // process arguments
                var o = {
                    container: 'wnd_' + String(Math.random()).substring(3),
                    style: 'top:100px;left:300px;display:none;',
                    title: 'Window',
                    width: '500',
                    icon: 'restore.png',
                    skin: 'black'
                };
                if (args) {
                    for (var k in args) {
                        o[k] = args[k];
                    }
                }
                // create html
                var sb = new StringBuilder();
                sb.appendFormat('<div id="{0}" class="containerPlus draggable" width="{1}" style="{2}" buttons="m,c" icon="{3}" skin="{4}" minimized="false">', o.container, o.width, o.style, o.icon, o.skin);
                sb.appendFormat('   <div class="no"><div class="ne"><div class="n">&nbsp;&nbsp;{0}</div></div>', o.title);
                sb.appendFormat('       <div class="o"><div class="e"><div class="c"><div class="content">{0}</div></div></div></div>', html);
                sb.appendFormat('		<div><div class="so"><div class="se"><div class="s"></div></div></div></div>');
                sb.appendFormat('   </div>');
                sb.appendFormat('</div>');
                $('#windowContainer').append(sb.build());

                // display window and load contents		
                $('#' + o.container)
		   	        .buildContainers({ containment: "document", elementsPath: "/web/css/elements/" })
		   	        .css('height', '350px').centerInClient()
		   	        .fadeIn()
					;

                if (callback) callback();
            }
        );
    },

    // redraws all screen components to reflect new data
    bindData: function() {

        var me = this;
        // don't start rendering until we know if we're logged in
        OnverseApp.AsyncData.currentLogin(function(res) {
            me.username = res && res.success ? res.value : null;
            if (me.username != null) {
                // if we're logged in, don't display anything until we have our profile loaded
                OnverseApp.AsyncData.myProfile(function(res) {

                    if (res && res.success) {
                        me.userProfile = res.value;
                        if (!me.userProfile.hasAvatar && !OnverseApp.noavatar) {
                            if (OnverseApp.MenuTabs.currentTab != 'Signin') {
                                OnverseApp.noavatar = true;
                                OnverseApp.MenuTabs.render();
                                OnverseApp.MenuTabs.setMenu('My', 'Avatar');
                            }
                            else {
                                OnverseApp.MenuTabs.render();
                            }
                        }
                        else if (OnverseApp.MenuTabs.currentMenu == 'Home' && OnverseApp.MenuTabs.currentTab == 'Signin') {
                            OnverseApp.MenuTabs.setMenu('Home', 'About');
                        }
                        else {
                            OnverseApp.MenuTabs.render();
                        }
                    }
                    me._updatePage();
                });
            }
            else {
                if (OnverseApp.MenuTabs.currentMenu == 'My Onverse') {
                    if (OnverseApp.MenuTabs.currentTab != 'FriendProfile') {
                        OnverseApp.MenuTabs.setMenu('Home', 'Signin');
                    }
                }
                me._updatePage();
            }
        });
    },

    // updates the widgets displayed on the page
    _updatePage: function() {

        log("_updatePage: " + OnverseApp.MenuTabs.currentTab);

        // hide the ads, they don't animate
        AdSense.hide();
        $('#captcha').css({ visibility: 'hidden', position: 'absolute', left: -2000, top: -2000 });

        // setup login block
        this.loginPane.set(OnverseApp.GUI.Login);
        this.loginPane.show({ username: this.username });

        // setup panel
        var gui = OnverseApp.GUI[OnverseApp.MenuTabs.currentTab];
        if (gui != null) {
            // TODO: clean up temp data pointer hack here
            var data;
            switch (OnverseApp.MenuTabs.currentTab) {
                case 'FriendProfile':
                    data = this.profile;
                    break;
                case 'Mailbox':
                    try {
                        data = MailboxViewWidget.mailbox;
                    } catch (ex) { }
                    break;
                default:
                    data = this.userProfile;
                    break;
            }
            if (!data || data == null) data = { _empty: '' };

            // update panels                                
            this.leftPane.set(gui.Left);
            this.mainPane.set(gui.Main);
            this.rightPane.set(gui.Right ? gui.Right : OnverseApp.GUI.Ads);

            if (showAnimations) {
                this.jq_left.find('div').fadeOut('slow');
                this.jq_main.find('div').fadeOut('slow');
                this.jq_right.find('div').fadeOut('slow');
            }


            // update panel sizes
            this._animateSwitchPanes(
		        (gui.leftWidth != null) ? gui.leftWidth : OnverseApp.GUI.defaultLeftWidth,
		        (gui.rightWidth != null) ? gui.rightWidth : OnverseApp.GUI.defaultRightWidth,
		        data
		    );
        }
        else {
            //reportError('Updating Page Widgets', 'gui is null for tab ' + this.currentTab);
        }
    },


    _animateSwitchPanes: function(widthLeft, widthRight, data, callback) {
        //log('_animateSwitchPanes l=' + widthLeft + ' r=' + widthRight);
        var me = this;
        if (showAnimations) {
            this.jq_main.stop().animate(
    	        { marginLeft: widthLeft, marginRight: widthRight }, 'slow', 'swing',
    	        function() {
    	            me.mainPane.show(data, callback);
    	            me.jq_main.find('div').hide().fadeIn('fast');
    	        }
    	    );
            this.jq_left.stop().animate(
  	   	        { width: widthLeft }, 'slow', 'swing',
  	   	        function() {
  	   	            me.leftPane.show(data, callback);
  	   	            me.jq_left.find('div').hide().fadeIn('fast');
  	   	        }
  	   	    );
            this.jq_right.stop().animate(
  	   	        { width: widthRight }, 'slow', 'swing',
  	   	        function() {
  	   	            me.rightPane.show(data, callback);
  	   	            me.jq_right.find('div').hide().fadeIn('fast');
  	   	        }
  	   	    );
        }
        else {
            this.jq_main.css({ marginLeft: widthLeft, marginRight: widthRight });
            this.jq_left.css({ width: widthLeft });
            this.jq_right.css({ width: widthRight });
            me.mainPane.show(data);
            me.leftPane.show(data);
            me.rightPane.show(data);
        }
    }
});

// Loads ajax data without blocking.  Callback methods triggered when data is ready.
var OnverseAsyncData = Class.extend({
	// constructor
	init: function() {
		// objects maintaining async binding events
		this.binding = {
			currentLogin: 	new AsyncDataBinder(),
 			myProfile: 		new AsyncDataBinder(),
 			friendProfile:	new AsyncDataBinder(),
			checkMail:      new AsyncDataBinder() 
		};
	},
	resetAll: function() {
	    this.binding.currentLogin.reset();
	    this.binding.myProfile.reset();
	    this.binding.checkMail.reset();
	},
	// current logged in user
	currentLogin: function(callback) {
		var async = this.binding.currentLogin;
		if (async.addListener(callback)) {	
			ajax('Authenticating', 'auth', 'User', null, function(res) {
				async.notify(res);
			});
		}		
	},
	// the logged in user's profile
	myProfile: function(callback) {
		var async = this.binding.myProfile;
		if (async.addListener(callback)) {
			OnverseApp.AsyncData.currentLogin(function(res) {
				if (res && res.value) {
					var username = res.value;
					ajax('Loading My Profile', 'profile', 'View', {u: username}, function(res) {
						async.notify(res);
					});
				}
			});	        
		}
	},
	// viewing friend's profile
	friendProfile: function(callback) {
		var async = this.binding.friendProfile;
		if (async.addListener(callback)) {	
			ajax('Loading Friend\'s Profile', 'profile', 'View', {u: app.profileUsername}, function(res) {
				async.notify(res);
			});
		}
	},		
	// current mail
	checkMail: function(callback) {
		var async = this.binding.checkMail;
		if (async.addListener(callback)) {	
			OnverseApp.AsyncData.currentLogin(function(res) {
				if (res && res.value) {
					var username = res.value;
					ajax('Checking mail', 'chat', 'List', {u: app.username}, function(res) {
						async.notify(res);
					});
				}
			});
		}
	}	
});

OnverseApp.AsyncData = new OnverseAsyncData();


// source: ../www.onverse.com/Website/web/js/onverse/gui.js

﻿
// List of new urls for old hash links.
OnverseApp.HashUrlMap = {
	'home': {
		'signin': 					'/',
		'about': 					'/home/about.html',
		'news': 						'/home/news/2009-09-18.html',
		'download': 				'/home/download.html',
		'music': 					'/home/music.html',
		'crew': 						'/home/crew.html',
		'competition': 			'/home/competition.html',
		'guides': 					'/home/guides.html',
		'learn-3d-world': 		'/home/about/learn3dWorld.html',
		'learn-social-network': '/home/about/learnSocialNetwork.html',
		'learn-your-home': 		'/home/about/learnYourHome.html',
		'learn-your-avatar': 	'/home/about/learnYourAvatar.html',
		'learn-beta': 				'/home/about.html',
		'icefall': 					'/home/icefall.html',
		'pets': 						'/home/pets.html'		
	},
	'my': {
		'profile': 					'/my/profile.html',
		'friends': 					'/my/friends.html',
		'invitefriends': 			'/my/invite.html',
		'mailbox': 					'/my/mailbox.html',
		'account': 					'/my/settings.html',
		'download': 				'/my/download.html',
		'avatar': 					'/my/avatar.html'
	},
	'marketplace': {
		'buycashcoins': 			'/marketplace/index.html',
		'gambitoffers': 			'/marketplace/offers.html',
		'gambitphone': 			'/marketplace/payByPhone.html'
	},
	'help': {
		'faq': 						'/help/faq.html',
		'game': 						'/help/game/playerMovement.html',
		'website': 					'/help/website/myonverse.html',
		'terms': 					'/help/terms.html',
		'privacy': 					'/help/privacy.html',
		'contact': 					'/help/contact.html',
		'jobs': 						'/help/jobs.html'
	}
};

function hashRedirect(hash) {
	hash = hash.replace('#', '');
	hash = hash.replace(' ', '');
	var a = hash.split('/');
	
	var menu1, menu2;
	if (a[0] == '') {
		menu1 = a[1]; menu2 = a[2];
	}
	else {
		menu1 = a[0]; menu2 = a[1];
    }
    menu1 = menu1.toLowerCase();
    menu2 = menu2.toLowerCase();

    if (OnverseApp.HashUrlMap[menu1]) {
	    var url;
	    if (menu2) {
	        url = OnverseApp.HashUrlMap[menu1][menu2];
	    }
	    else {
	        for (var i in OnverseApp.HashUrlMap[menu1]) {
	            url = OnverseApp.HashUrlMap[menu1][i];
	            break;
	        }
	    }
	    if (url) {
		    document.location = url;
	    }		
	}
}


// Defines the menu tabs and submenus available on website
OnverseApp.Menu = {
    'Home': {
        visible: true,
        text: 'Home',
        link: 'index.html',
        tabs: {
            'Sign In': 'Signin',
            'About': 'About',
            'News': 'News',
            'Download': 'Download',
            'Music': 'Music',
            'The Crew': 'Crew',
            'Video Competition': 'Competition',
            '__Guide Program': 'Guides',
            '__3dWorld': 'Learn-3D-World',
            '__social': 'Learn-Social-Network',
            '__yourhome': 'Learn-Your-Home',
            '__youravatar': 'Learn-Your-Avatar',
            '__beta': 'Learn-Beta',
            '__icefall': 'IceFall'
        }        
    },
    'My': {
        visible: true,
        text: 'My Onverse',
        tabs: {
            'My Profile': 'Profile',
            'Friends': 'Friends',
            'Invite Friends': 'InviteFriends',            
            'Mailbox': 'Mailbox',
            'Account Settings': 'Account',
            'Download': 'Download',
            'My Avatar': 'Avatar'
        }
    },
    'Marketplace': {
        visible: true,
        text: 'Marketplace',
        tabs: {
            'Buy Cash Coins': 'BuyCashCoins',
            'Special Offers': 'GambitOffers',
            'Pay by Phone': 'GambitPhone'
        }
    },
    'Forum': {
        text: 'Forum',
        link: 'http://forum.onverse.com/'        
        //link: 'http://forum.onverse.local/'        
    },
    

    'Help': {
        visible: true,
        text: 'Help',
        link: 'help.html',
        tabs: {
            'FAQ': 'FAQ',
            'Game Tips': 'Game',
            'Website Tips': 'Website',
            'Terms of Use': 'Terms',
            'Privacy Policy': 'Privacy',
            'Contact Us': 'Contact',
            '__Jobs': 'Jobs'
        }
    }    
};

OnverseApp.MainPages = {
    'index.html': { menu: 'Home', tab: 'About' },
    'help.html': { menu: 'Help', tab: 'FAQ' },

    isOnPage: function(url) {
        var urlMain = this._getMainPage(url);
        var myMain = this._getMainPage();
        return urlMain.menu == myMain.menu;
    },
    isMainPage: function() {
        var main = this._getMainPage();
        return OnverseApp.MenuTabs.currentMenu == main.menu
            && OnverseApp.MenuTabs.currentTab == main.tab;
    },
    getMainPageTab: function() {
        return this._getMainPage().menu;
    },
    _getUrl: function(url) {
        if (!url) url = '' + document.location;
        var i = url.indexOf('#');
        if (i > -1) url = url.substring(0, i);
        i = url.lastIndexOf('/');
        url = url.substring(i + 1);
        return url;
    },
    _getMainPage: function(baseUrl) {
        if (!baseUrl) baseUrl = '' + document.location;
        var url = this._getUrl(baseUrl);
        if (this[url]) return this[url];
        return this['index.html'];
    }
};




// Defines the widgets to display for each submenu tab
OnverseApp.GUI = {
    
    // default size of left panel
    defaultLeftWidth: 285,
    defaultRightWidth: 300,

    // ---[General]------------------------------------------------

    // headers and menus
    Ads: new WidgetList([{ type: 'AdWidget', script: 'web/js/onverse/widgets/adWidgets.js' }]),
    Login: new WidgetList([]),
    Tabs: new WidgetList([{ type: 'MainMenuWidget', script: 'web/js/onverse/widgets/menuWidgets.js' }]),
    Tabs2: new WidgetList([{ type: 'SubTabWidget', script: 'web/js/onverse/widgets/menuWidgets.js' }]),

    //
    Avatar: {
        leftWidth: 0,
        rightWidth: 275,
        Left: new WidgetList([]),
        Right: new WidgetList([
            { type: 'SetupRequiredWidget', script: 'web/js/onverse/widgets/loginWidgets.js' },
        ]),
        Main: new WidgetList([{ type: 'SignupWidget', script: 'web/js/onverse/widgets/loginWidgets.js'}])
    },
    
    // login box
    Signin: {
        leftWidth: 0,
        rightWidth: 275,
        Left: new WidgetList([]),
        Right: new WidgetList([
            { type: 'LoginRequiredWidget', script: 'web/js/onverse/widgets/loginWidgets.js' },
            { type: 'LostPasswordWidget', script: 'web/js/onverse/widgets/loginWidgets.js' },
            { type: 'OnverseHowtoWidget', script: 'web/js/onverse/widgets/loginWidgets.js' },
            { type: 'OnverseVideoWidget', script: 'web/js/onverse/widgets/loginWidgets.js' },
        ]),
        Main: new WidgetList([
            { type: 'SignupWidget', script: 'web/js/onverse/widgets/loginWidgets.js' }
        ])
    },
    
    // ---[Tab: Home]------------------------------------------------
    About: {
        leftWidth: 0,
        rightWidth: 0,
        Left: new WidgetList([ ]),
        Main: new WidgetList([
            { type: 'OnverseNewsWidget', script: 'web/html/widget/home/news.htm.js' }
            ]),
        Right: new WidgetList([ { type: 'HideAdsWidget', script: 'web/js/onverse/widgets/adWidgets.js' }])
    },
    News: {
        leftWidth: 0,
        rightWidth: 160,
        Left: new WidgetList([]),
        Main: new WidgetList([{ type: 'OnverseBlogWidget', script: 'web/html/widget/home/blog.htm.js' }]),
		Right: new WidgetList([
		    { type: 'OnverseNewsArchiveWidget', script: 'web/html/widget/home/blog.htm.js' },
		    { type: 'TallAdWidget', script: 'web/js/onverse/widgets/adWidgets.js' }		    
		])
    },    
    Download: {
        leftWidth: 0,
        rightWidth: 336,
        Left: new WidgetList([]),
        Main: new WidgetList([{ type: 'DownloadWidget', script: 'web/html/widget/home/download.htm.js'}]),
		Right: new WidgetList([
		    { type: 'LargeAdWidget', script: 'web/js/onverse/widgets/adWidgets.js' }
		])
	},
	Crew: {
		    leftWidth: 0,
		    rightWidth: 160,
		    Left: new WidgetList([]),
		    Main: new WidgetList([{ type: 'CrewWidget', script: 'web/html/widget/home/crew.htm.js'}]),
		    Right: new WidgetList([{ type: 'TallAdWidget', script: 'web/js/onverse/widgets/adWidgets.js' }])
		},
    Competition: {
        leftWidth: 0,
        rightWidth: 160,
        Left: new WidgetList([]),
        Main: new WidgetList([{ type: 'CompetitionWidget', script: 'web/html/widget/home/competition.htm.js'}]),
        Right: new WidgetList([{ type: 'TallAdWidget', script: 'web/js/onverse/widgets/adWidgets.js'}])    
    },
    Guides: {
        leftWidth: 0,
        rightWidth: 160,
        Left: new WidgetList([]),
        Main: new WidgetList([{ type: 'GuidesWidget', script: 'web/html/widget/home/guides.htm.js'}]),
	    Right: new WidgetList([{ type: 'TallAdWidget', script: 'web/js/onverse/widgets/adWidgets.js' }])
	},
	IceFall: {
	    leftWidth: 0,
	    rightWidth: 160,
	    Left: new WidgetList([]),
	    Main: new WidgetList([{ type: 'IceFallWidget', script: 'web/html/widget/home/icefall.htm.js'}]),
	    Right: new WidgetList([{ type: 'TallAdWidget', script: 'web/js/onverse/widgets/adWidgets.js'}])
	},
	Pets: {
	    leftWidth: 0,
	    rightWidth: 160,
	    Left: new WidgetList([]),
	    Main: new WidgetList([{ type: 'PetsWidget', script: 'web/html/widget/home/pets.htm.js'}]),
	    Right: new WidgetList([{ type: 'TallAdWidget', script: 'web/js/onverse/widgets/adWidgets.js'}])
	}, 	
    Signup: {
        leftWidth: 265,
        Left: new WidgetList([
            { type: 'CreateAvatarWidget', script: 'web/html/widget/home/signup.htm.js' }
        ]),
        Main: new WidgetList([{ type: 'CreateAccountWidget', script: 'web/html/widget/home/signup.htm.js'}])
    },    
    
    'Learn-3D-World': {
        leftWidth: 0,
        rightWidth: 0,
        Left: new WidgetList([]),
        Right: new WidgetList([]),
        Main: new WidgetList([{ type: 'Learn3DWorldWidget', script: 'web/html/widget/home/learn-3d-world.htm.js'}])
    },
    'Learn-Social-Network': {
        leftWidth: 0,
        rightWidth: 0,
        Left: new WidgetList([]),
        Right: new WidgetList([]),
        Main: new WidgetList([{ type: 'LearnSocialNetworkWidget', script: 'web/html/widget/home/learn-social-network.htm.js'}])
    },
    'Learn-Your-Home': {
        leftWidth: 0,
        rightWidth: 0,
        Left: new WidgetList([]),
        Right: new WidgetList([]),
        Main: new WidgetList([{ type: 'LearnYourHomeWidget', script: 'web/html/widget/home/learn-your-home.htm.js'}])
    },
    'Learn-Your-Avatar': {
        leftWidth: 0,
        rightWidth: 0,
        Left: new WidgetList([]),
        Right: new WidgetList([]),
        Main: new WidgetList([{ type: 'LearnYourAvatarWidget', script: 'web/html/widget/home/learn-your-avatar.htm.js'}])
    },
    'Learn-Beta': {
        leftWidth: 0,
        rightWidth: 160,
        Left: new WidgetList([]),
        Main: new WidgetList([{ type: 'LearnBetaWidget', script: 'web/html/widget/home/learn-beta.htm.js'}]),
		Right: new WidgetList([
		    { type: 'TallAdWidget', script: 'web/js/onverse/widgets/adWidgets.js' }		    
		])
    },
    
    // ---[Tab: My Onverse]------------------------------------------
    Profile: {
        leftWidth: 200,
        rightWidth: 200,
        Left: new WidgetList([
            { type: 'WideBarAdWidgetSpecial', script: 'web/js/onverse/widgets/adWidgets.js' },
			{ key: 'photoAlbums', type: 'PhotoAlbumsWidget', script: 'web/js/onverse/widgets/photoWidgets.js' },
			{ key: 'profile', type: 'MyProfileWidget', script: 'web/js/onverse/widgets/profileWidgets.js' }
		]),
        Main: new WidgetList([
            { type: 'Gap90Widget', script: 'web/js/onverse/widgets/adWidgets.js' },
			{ type: 'NameWidget', script: 'web/js/onverse/widgets/profileWidgets.js' },
			{ key: 'status', type: 'StatusWidget', script: 'web/js/onverse/widgets/profileWidgets.js' },
			{ key: 'about', type: 'AboutWidget', script: 'web/js/onverse/widgets/profileWidgets.js'},
			{ type: 'MessageBoardWidget', script: 'web/js/onverse/widgets/messageBoardWidgets.js'}
		]),
		Right: new WidgetList([
            { type: 'Gap90Widget', script: 'web/js/onverse/widgets/adWidgets.js' },
			{ key: 'videoAlbums', type: 'MyVideosWidget', script: 'web/js/onverse/widgets/videoWidgets.js' },
			{ key: 'blogs', type: 'BlogWidget', script: 'web/html/widget/myonverse/blogWidgets.js'}
		])
	 },
    FriendProfile: {
        leftWidth: 200,
        rightWidth: 200,
        Left: new WidgetList([
                { type: 'WideBarAdWidgetSpecial', script: 'web/js/onverse/widgets/adWidgets.js' },
			    { key: 'photoAlbums', type: 'FriendAlbumsWidget', script: 'web/js/onverse/widgets/friendWidgets.js' },
			    { key: 'profile', type: 'FriendProfileWidget', script: 'web/js/onverse/widgets/friendWidgets.js' },
			    { type: 'FriendsFriendsWidget', script: 'web/js/onverse/widgets/widgets.js' }
		    ]),
        Main: new WidgetList([
                { type: 'Gap90Widget', script: 'web/js/onverse/widgets/adWidgets.js' },
			    { type: 'FriendNameWidget', script: 'web/js/onverse/widgets/profileWidgets.js' },
			    { type: 'PrivateFriendWidget', script: 'web/js/onverse/widgets/friendWidgets.js' },
			    { key: 'status', type: 'FriendStatusWidget', script: 'web/js/onverse/widgets/friendWidgets.js' },
			    { key: 'about', type: 'AboutFriendWidget', script: 'web/js/onverse/widgets/friendWidgets.js' },
			    { type: 'FriendMessageBoardWidget', script: 'web/js/onverse/widgets/messageBoardWidgets.js' }
		    ]),
        Right: new WidgetList([
                { type: 'Gap90Widget', script: 'web/js/onverse/widgets/adWidgets.js' },
			    { key: 'videoAlbums', type: 'FriendVideosWidget', script: 'web/js/onverse/widgets/friendWidgets.js' },
			    { key: 'blogs', type: 'FriendBlogWidget', script: 'web/js/onverse/widgets/friendWidgets.js' }
		    ])
    },    

    Communities: {
        Left: new WidgetList([
			{ type: 'SearchCommunitiesWidget', script: 'web/js/onverse/widgets/widgets.js' }
		]),
        Main: new WidgetList([
			{ key: 'friends', type: 'MyCommunitiesWidget', script: 'web/js/onverse/widgets/widgets.js' }
		])
    },
    Stuff: {
        leftWidth: 200,
        Left: new WidgetList([
			{ type: 'SearchStuffWidget', script: 'web/js/onverse/widgets/widgets.js' }
		]),
        Main: new WidgetList([
			{ key: 'stuff', type: 'MyStuffWidget', script: 'web/js/onverse/widgets/widgets.js' }
		])
    },
    Town: {
        leftWidth: 200,    
        Left: new WidgetList([ ]),
        Main: new WidgetList([{ type: 'MarketplaceWidget', script: 'web/js/onverse/widgets/widgets.js'}])
    },
    Friends: {
        leftWidth: 200,    
        Left: new WidgetList([
            { type: 'WideBarAdWidgetSpecial', script: 'web/js/onverse/widgets/adWidgets.js' },
			{ type: 'MyFriendsWidget', script: 'web/js/onverse/widgets/widgets.js' }
		]),
        Main: new WidgetList([
            { type: 'Gap90Widget', script: 'web/js/onverse/widgets/adWidgets.js' },
            { key: 'friends', type: 'PendingFriendsWidget', script: 'web/js/onverse/widgets/widgets.js' },
			{ type: 'InGameUpdatesWidget', script: 'web/js/onverse/widgets/profileWidgets.js'}        
		]),
		Right: new WidgetList([
            { type: 'Gap90Widget', script: 'web/js/onverse/widgets/adWidgets.js' },
		    { type: 'InviteFriendsAdWidget', script: 'web/js/onverse/widgets/friendWidgets.js' },		    
		    { type: 'RandomFriendsWidget', script: 'web/js/onverse/widgets/widgets.js'},
		    { type: 'NewMembersWidget', script: 'web/js/onverse/widgets/widgets.js'},
		])
    },
    InviteFriends:{
        leftWidth: 300,
        rightWidth: 160,
        Left: new WidgetList([
            { type: 'InviteFriendsWidget', script: 'web/js/onverse/widgets/friendWidgets.js' }
        ]),
        Main: new WidgetList([
            { type: 'InviteFriendsCodeWidget', script: 'web/js/onverse/widgets/friendWidgets.js' }
        ]),
        Right: new WidgetList([{ type: 'TallAdWidget', script: 'web/js/onverse/widgets/adWidgets.js' }])
    },
    
    Mailbox: {
        leftWidth: 0,    
        rightWidth: 160,
        Left: new WidgetList([]),            
        Main: new WidgetList([{ type: 'MailboxViewWidget', script: 'web/js/onverse/widgets/mailWidgets.js' }]),
        Right: new WidgetList([{ type: 'TallAdWidget', script: 'web/js/onverse/widgets/adWidgets.js' }])
    },
    Account: {
        leftWidth: 0,    
        rightWidth: 336,
        Left: new WidgetList([]),    
        Main: new WidgetList([{ type: 'SettingsWidget', script: 'web/js/onverse/widgets/settingsWidgets.js' }]),
        Right: new WidgetList([{ type: 'LargeAdWidget', script: 'web/js/onverse/widgets/adWidgets.js' }])
    },           
    
    // ---[Tab: Marketplace]-----------------------------------------
    Marketplace: {
        Left: new WidgetList([]),
        Main: new WidgetList([{ type: 'MarketplaceWidget', script: 'web/js/onverse/widgets/widgets.js'}])
    },
    BuyCashCoins: {
        leftWidth: 0,    
        rightWidth: 336,
        Left: new WidgetList([]),
        Main: new WidgetList([{ type: 'BuyCashCoinsWidget', script: 'web/js/onverse/widgets/marketplaceWidgets.js'}]),
        Right: new WidgetList([
            { type: 'PlayerPointsWidget', script: 'web/js/onverse/widgets/marketplaceWidgets.js' }//,
//            { type: 'LargeAdWidget', script: 'web/js/onverse/widgets/adWidgets.js' }
        ])
    },   
    GambitOffers: {
        leftWidth: 0,
        rightWidth: 300,
        Left: new WidgetList([]),
        Main: new WidgetList([
            { type: 'GambitOffersWidget', script: 'web/js/onverse/widgets/marketplaceWidgets.js'}
        ]),
        Right: new WidgetList([
            { type: 'MediumAdWidget', script: 'web/js/onverse/widgets/adWidgets.js' }
        ])
    },

    GambitPhone: {
        leftWidth: 0,
        rightWidth: 300,
        Left: new WidgetList([]),
        Main: new WidgetList([
            { type: 'GambitPayByPhoneWidget', script: 'web/js/onverse/widgets/marketplaceWidgets.js' }
        ]),
        Right: new WidgetList([
            { type: 'MediumAdWidget', script: 'web/js/onverse/widgets/adWidgets.js'}]
        )
    },
    
    // ---[Tab: Help]------------------------------------------------    
    FAQ: {    
        leftWidth: 0, rightWidth: 170,
        Left: new WidgetList([]),
        Main: new WidgetList([{ type: 'FaqWidget', script: 'web/js/onverse/widgets/helpWidgets.js' }])
	},

    Game: {
	    leftWidth: 200,
	    rightWidth: 170,
	    Left: new WidgetList([
	        { type: 'GameTipsListWidget', script: 'web/html/widget/help/game.htm.js' },
	    ]),
	    Main: new WidgetList([{ type: 'GameTipsWidget', script: 'web/html/widget/help/game.htm.js'}])
	},

	Website: {
	    leftWidth: 200,
	    rightWidth: 170,
	    Left: new WidgetList([
	        { type: 'WebsiteTipsListWidget', script: 'web/html/widget/help/website.htm.js' },
	    ]),
	    Main: new WidgetList([{ type: 'WebsiteTipsWidget', script: 'web/html/widget/help/website.htm.js'}])
	},

	Music: {
	    leftWidth: 0, rightWidth: 300,
	    Left: new WidgetList([]),
	    Main: new WidgetList([{ type: 'MusicWidget', script: 'web/js/onverse/widgets/helpWidgets.js'}])
    },
	
    Terms: { 
        leftWidth: 0, rightWidth: 170,
        Left: new WidgetList([ ]),
        Main: new WidgetList([{ type: 'TermsOfUseWidget', script: 'web/js/onverse/widgets/helpWidgets.js' }])
    },
    Privacy: {
        leftWidth: 0, rightWidth: 170,
        Left: new WidgetList([ ]),
        Main: new WidgetList([{ type: 'PrivacyPolicyWidget', script: 'web/js/onverse/widgets/helpWidgets.js' }])
    },
    Advertising: {
        leftWidth: 0, rightWidth: 170,
        Left: new WidgetList([ ]),
        Main: new WidgetList([{ type: 'AdvertisingWidget', script: 'web/js/onverse/widgets/helpWidgets.js' }])
    },    
    Contact: {
        leftWidth: 0, rightWidth: 170,
        Left: new WidgetList([ ]),
        Main: new WidgetList([{ type: 'ContactWidget', script: 'web/js/onverse/widgets/helpWidgets.js' }])
    },
    Jobs: {
        leftWidth: 0, rightWidth: 170,
        Left: new WidgetList([ ]),
        Main: new WidgetList([{ type: 'JobsWidget', script: 'web/js/onverse/widgets/widgets.js' }])
    }
};




// source: ../www.onverse.com/Website/web/js/onverse/widgets/widgets.js

﻿//
// Title: Onverse GUI objects
// File: widgets.js
// Author: Scott Mitting
// Date: 2009-02-12
// Abstract:
//	Javascript objects for maintaining the Onverse website GUI.
//

/*** MARKETPLACE WIDGETS ***/

var MarketplaceWidget = IListWidget.extend({
	title: 'Onverse Marketplace',
	prerender: function(jq, profile) { jq.append('<p>Not Implemented</p>'); },
	renderItem: function(jq, obj, id) { }
});

//-------------------------------------------------------------------
var SearchFriendsWidget = IWidget.extend({
	title: 'Find Friends',
	render: function(jq, data) {
	    ajaxWidget('Loading Friend Finder', 'web/html/widget/myonverse/friends/findFriends.htm',
	        function(html) {
	            jq.html(html);  
                if (jq.html() == null) return true; // reload
	        }
	    );
	}
});
SearchFriendsWidget.find = function(caller) {
    var args = { title: 'Find Friends', width: '820' };
    app.openWindow('/web/html/widget/myonverse/friends/findResults.htm', args, function() {
        // check if this is the upper-left search
        var query = null;
        $(caller).parents('#find_friends').each(function() {
            var $this = $(this);
            query = $this.find('#friend_search').val();
        });
        // otherwise assume its on the friends page
        if (query == null) {
            query = $(caller).parents('.section').find('#avatar').val();
        }
        ajax('Finding friends', 'friend', 'Find', { avatar: query },
            function(res) {
                if (res.error) { // hide window if error
                    $('#findTableContainer').parents('.containerPlus').closeWindow();
                    return;
                }

                // loading friends                
                OnverseApp.AsyncData.myProfile(function(fres) {
                    var friends = fres.value.friends;

                    // loading results                            
                    ajaxWidget('Loading Results Widget', '/web/html/widget/myonverse/friends/findResultsTable.htm',
                        function(html) {
                            var sb = new StringBuilder();
                            for (var i in res.value) {
                                var friend = res.value[i];

                                // only show add when not already friends.
                                var sbAddLink = new StringBuilder();
                                if (!friends[friend.AccID]) {
                                    sbAddLink.appendFormat('<a href="javascript:nil()" style="color: black" onclick="SearchFriendsWidget.addFriend({0}, \'{1}\')">Add Friend</a><br/>', friend.AccID, friend.Avatar);
                                }
                                var sbViewLink = new StringBuilder();
                                sbViewLink.appendFormat('<a href="{0}" style="color: black">View Profile</a>', '#profiles/' + friend.Avatar);

                                sb.appendFormat('<tr>');
                                sb.appendFormat('   <td>{0}{1}</td>', sbAddLink.build(), sbViewLink.build());
                                sb.appendFormat('   <td>{0}</td>', friend.Avatar);
                                sb.appendFormat('   <td>{0}</td>', friend.Name);
                                sb.appendFormat('   <td>{0}</td>', friend.Location);
                                sb.appendFormat('   <td>{0}</td>', friend.Interests);
                                sb.appendFormat('</tr>');
                            }
                            html = String.format(html, sb.build());
                            $('#findTableContainer').html(html);
                            $('#findResultsTable').flexigrid({ height: 300, singleSelect: true });
                        }
                    );
                });
            }
        );
    });
};
SearchFriendsWidget.addFriend = function(id, name) {
    if (confirm('Add avatar ' + name + ' as a friend?')) {
        ajax('Adding Friend', 'friend', 'Add', { u: name }, 
            function(res) {
                if (res.success) {
                    alert('Friend request sent to ' + name + ' for confirmation.');
                }
            }
        );    
    }    
};

//-------------------------------------------------------------------
// My Friends Widgets
//-------------------------------------------------------------------

// List of friends on my profile page
var MyFriendsWidget = IObjectWidget.extend({
	title: 'My Friends',
	renderItem: function(jq, obj, id) {
        if (jq) MyFriendsWidget.jq = jq;
	    MyFriendsWidget.load(jq, app.userProfile.profileid, 1);	
	}
});
// List of friends on friend's profile page
var FriendsFriendsWidget = IObjectWidget.extend({
	title: 'Friends',
	renderItem: function(jq, obj, id) {	
	    if (app.profile.privateView) {
	        jq.parents('.section').hide();
	    }
	    else {	
    	    MyFriendsWidget.load(jq, app.profile.profileid, 1);	
	    }
	}
});
// Loads a page of friends
MyFriendsWidget.load = function(jq, accid, page) {
    MyFriendsWidget.accid = accid;
    ajax('Loading Friend Count', 'friend', 'Count', { id: accid },
        function(res) {
            var friendCount = res.value;
            $('#friendCount').text('(' + res.value + ')');
            var i = (page - 1) * 10;
            ajax('Loading Friends', 'friend', 'List', { id: accid, index: i },
                function(res) {
                    MyFriendsWidget.RenderAll(jq, page, res.value, friendCount);
                }
            );
        }
    );

};
// Renders all loaded data with paging
MyFriendsWidget.RenderAll = function(jq, page, value, friendCount) {
    if (jq) MyFriendsWidget.jq = jq; else jq = MyFriendsWidget.jq;
    jq.html('');
    for (var i in value) {
        MyFriendsWidget.RenderOne(jq, value[i].Value);
    }	    
    jq.append('<div class="clear"></div>');
    if (page > 1 || friendCount > 10) {
        MyFriendsWidget.addPaging(jq, page, value.length, friendCount);
    }
    jq.append('<div class="clear"></div>');
}
// Renders a friend in the my friends section
MyFriendsWidget.RenderOne = function(jq, obj) {
    if (!obj.pending) {
        var sb = new StringBuilder();
        sb.appendFormat('<a href="#profiles/{0}" style="text-decoration:none">', obj.Name);
        sb.appendFormat('   <div class="friend">');
        sb.appendFormat('       <span>{0}</span><br/>', obj.Name);
        sb.appendFormat('       <img src="{0}" width="64" height="64" border="0" />', photomap.profilethumbUrl(obj.imageid));
        sb.appendFormat('   </div></a>');
        jq.append(sb.build());	    
    }
};
// Adds the pager to either friend list widget
MyFriendsWidget.addPaging = function(jq, page, count, friendCount) {
    var sb = new StringBuilder();
    sb.appendFormat('<div class="pager" align="center">');
    if (page > 1) {
        var p = Number(page) - 1;
        sb.appendFormat(' <div class="prev" onclick="{0}"></div>', 'MyFriendsWidget.load(null, MyFriendsWidget.accid, ' + p + ')');
    }
    else {
        sb.appendFormat(' <div class="off"></div>');
    }

    //sb.appendFormat(' <div>Page {0}</div>', page);
    sb.appendFormat('<div>Page <select onchange="MyFriendsWidget.load(null, MyFriendsWidget.accid, $(this).val());">');
    var pages = (friendCount / 10) + 1;
    for (var i = 1; i <= pages; i++) {
        if (i == page) {
            sb.appendFormat('<option selected>' + i + '</option>');
        }
        else {
            sb.appendFormat('<option>' + i + '</option>');
        }
    }
    sb.appendFormat('</select></div>');

    if (page < (friendCount / 10)) {
        var p = Number(page) + 1;
        sb.appendFormat(' <div class="next" onclick="{0}"></div>', 'MyFriendsWidget.load(null, MyFriendsWidget.accid, ' + p + ')');
    }
    else {
        sb.appendFormat(' <div class="off"></div>');
    }
    sb.appendFormat('</div>');
    sb.appendFormat('<div class="clear"></div>');

    jq.append(sb.build());
};	



//-------------------------------------------------------------------
var RandomFriendsWidget = IObjectWidget.extend({
    title: 'People you may know',
    renderItem: function(jq) {
        function render(data) {
            var sb = new StringBuilder();
            for (var i in data) {
                var obj = data[i];
                sb.appendFormat('<a href="#profiles/{0}" style="text-decoration:none">', obj.Avatar);
                sb.appendFormat('   <div class="friend">');
                sb.appendFormat('       <span>{0}</span><br/>', obj.Avatar);
                sb.appendFormat('       <img src="{0}" width="64" height="64" border="0" />', photomap.profilethumbUrl(obj.Image));
                sb.appendFormat('   </div></a>');
            }
            sb.append('<div class="clear"></div>');
            jq.html(sb.build());
        }
        ajax('Finding people you may know', 'friend', 'FindRandom', {},
            function(res) {
                render(res.value);
            }
        );
    }
});


//-------------------------------------------------------------------
var NewMembersWidget = IObjectWidget.extend({
	title: 'Newest Members',
	renderItem: function(jq) {
    	ajax('Finding newest members', 'friend', 'FindNewMembers', {},
            function(res) {
                var sb = new StringBuilder();
                for (var i in res.value) {
                    var obj = res.value[i];
                    sb.appendFormat('<a href="#profiles/{0}" style="text-decoration:none">', obj.Avatar);
	                sb.appendFormat('   <div class="friend">');
                    sb.appendFormat('       <span>{0}</span><br/>', obj.Avatar);
                    sb.appendFormat('       <img src="{0}" width="64" height="64" border="0" />', photomap.profilethumbUrl(obj.Image));
	                sb.appendFormat('   </div></a>');
                }
                sb.append('<div class="clear"></div>');
                jq.html(sb.build());	
	        }
	    );
	}
});

//-------------------------------------------------------------------
var PendingFriendsWidget = {};
PendingFriendsWidget.init = function(jq, obj, id) {
    ajax('Finding pending friends', 'friend', 'PendingList', {},
        function(res) {
            if (res.value.length > 0) {
                var sb = new StringBuilder();
                for (var i in res.value) {
                    var obj = res.value[i].Value;
                    sb.appendFormat('<div class="pending-friend">');
                    sb.appendFormat('<a href="#profiles/{0}">', obj.Name);
                    sb.appendFormat('<img src="{0}" width="64" height="64" border="0" /></a>', photomap.profilethumbUrl(obj.imageid));
                    sb.appendFormat('<p><b>{0}</b> would like to be your friend.</p>', obj.Name);
                    sb.appendFormat('<p><input type="button" value="Accept" onclick="PendingFriendsWidget.accept(this, \'{0}\')" />', obj.Name);
                    sb.appendFormat('<input type="button" value="Decline" onclick="PendingFriendsWidget.decline(this, \'{0}\')" /></p>', obj.Name);
                    sb.appendFormat('<h2></h2></div>');
                }
                jq.html(sb.build());
            }
            else {
                jq.parents('.section').remove();
            }
        }
    );
};

PendingFriendsWidget.accept = function(caller, username) {
    ajax('Accepting Friendship', 'friend', 'Accept', {u: username}, 
        function(res) {
            alert('You are now friends with ' + username);
            $(caller).parents('.pending-friend').fadeOut();
            app.loadMyProfile();
        }
    );
}

PendingFriendsWidget.decline = function(caller, username) {
    ajax('Declining Friendship', 'friend', 'Deny', {u: username}, 
        function(res) {
            $(caller).parents('.pending-friend').fadeOut();
            app.loadMyProfile();
        }
    );
}

//-------------------------------------------------------------------
var SearchCommunitiesWidget = IWidget.extend({
	title: 'Search Communities',
	render: function(jq, data) { jq.append('<h2>community search goes here</h2>'); }	
});

//-------------------------------------------------------------------
var MyCommunitiesWidget = IListWidget.extend({
	title: 'My Communities',
	renderItem: function(jq, obj, id) { jq.append('<h2>testing community - ' + obj.Name + '</h2>'); }		
});

//-------------------------------------------------------------------
var SearchStuffWidget = IWidget.extend({
	title: 'Search for Stuff',
	render: function(jq, data) { jq.append('<h2>stuff search goes here</h2>'); }	
});

//-------------------------------------------------------------------
var MyStuffWidget = IListWidget.extend({
	title: 'My Stuff',
	renderItem: function(jq, obj, id) { jq.append('<h2>testing stuff</h2>'); }		
});

//-------------------------------------------------------------------
var ShopWidget = IListWidget.extend({
	title: 'Shop',
	renderItem: function(jq, obj, id) { jq.append('<h2>testing shop</h2>'); }		
});

//-------------------------------------------------------------------
var JobsWidget = IObjectWidget.extend({
	title: 'Jobs',
	renderItem: function(jq, obj, id) {
	    ajaxWidget('Jobs', 'web/html/widget/help/jobs.htm', 
	        function(html) {
	            jq.html(html);
	        }
	    );
	}		
});

//-------------------------------------------------------------------
var PlayOnverseWidget = {}; 

// Ask user if onverse is installed before attempting launch via url
PlayOnverseWidget.launch = function() {

    document.location = '/home/download.html';

    /*
    var okay = false;
    function dosignup() {
    alert('You must login or create an account before downloading and playing Onverse.');
    document.location = '/signup/';
    }
    setTimeout(function() { if (!okay) dosignup(); }, 1500);

    OnverseApp.AsyncData.myProfile(function(res) {
    if (res && res.success) {
    okay = true;
    var windowArgs = { title: 'Play for FREE now!', width: '700' };
    document.location = '/home/download.html';
    //app.openWindow('/web/html/widget/home/askDownload.htm', windowArgs, function() { });
    }
    else {
    okay = true;
    alert('You must login or create an account before downloading and playing Onverse.');
    document.location = '/signup/';
    }
    });
    
    */
};

PlayOnverseWidget.play = function() {
    PlayOnverseWidget.close();
    document.location = 'onverse:';
};

PlayOnverseWidget.download = function() {
    PlayOnverseWidget.close();
    document.location = '/home/download.html';
};

PlayOnverseWidget.close = function() {
    $('#askDownloadWindow').parents('.containerPlus').closeWindow();
};


// source: ../www.onverse.com/Website/web/js/onverse/menu.js

﻿
function fixBottomCorners() {
    var jq = $('#footer-bottom');
    var top = jq.offset().top + 1;
    jq.find('div').css({ top: top });
}

// Tab and submenu display for OnverseApp
OnverseApp.MenuTabsObject = Class.extend({
    currentMenu: null,  // current top menu tab to be viewed    
    currentTab: null,   // current tab to be viewed

    // constructor
    init: function() {
        this.tabPane = new WidgetContainer('tabs', OnverseApp.GUI.Tabs);
        this.tab2Pane = new WidgetContainer('tabs2', OnverseApp.GUI.Tabs2);
    },
    // selects a new menu tab
    setMenu: function(menu, tab) {
	    
	    alert('setMenu disabled');
	    return;

        // save old selection
        var oldmenu = this.currentMenu;
        var oldtab = this.currentTab;

        // set new menu
        if (menu != null) this.currentMenu = menu;
        if (tab != null) this.currentTab = tab;

        // select default tab if none was provided
        if (this.currentTab == null || this.currentTab == '') {
            this.currentTab = this.getDefaultSubmenu();
        }

        // redirect to the correct html page for this content
        if (OnverseApp.MainPages.isOnPage(this.getCurrentMenu().link) == false) {
            document.location = this.getCurrentMenu().link;
        }

        // render new selection
        this.render();
        this.fadeIn();

        // inform page that it may need updated
        app.bindData();
        setInterval(fixBottomCorners, 250);
    },
    // returns the menu to display
    getCurrentMenu: function() {
        var ret = OnverseApp.Menu[this.currentMenu];
        return ret ? ret : {};
    },
    // returns the default submenu item for the current menu
    getDefaultSubmenu: function() {
        var menu = this.getCurrentMenu();
        for (var tab in menu.tabs) {
            return menu.tabs[tab];
        }
        return null;
    },
    // redraws the menu
    render: function() {
        var menuobj = this.getCurrentMenu();
        this.tabPane.show(OnverseApp.Menu);
        this.tab2Pane.show(menuobj.tabs);

        if (OnverseApp.MainPages.isMainPage() == false) {
            $('#default').hide();
        }
        else {
            $('#default').show();
        }
    },

    // fades in a new menu
    fadeIn: function() {
        if (this._lastmenu2 != this.currentMenu) {
            this._lastmenu2 = this.currentMenu;
            gently(function() {
                $('#tabs2 ul')
                    .css({ position: 'absolute', left: -150 })
                    .animate({ left: 20 }, 350);
            });
        }
    }
});



// source: ../www.onverse.com/Website/web/js/onverse/widgets/adWidgets.js


var AdWidget = IObjectWidget.extend({
	style: WidgetStyles.plain,
	renderItem: function(jq, obj, id) {
	    AdSense.place(jq, ['mediumRectangle']);
	}
});

var MediumAdWidget = IObjectWidget.extend({
	style: WidgetStyles.plain,
	renderItem: function(jq, obj, id) {
	    AdSense.place(jq, ['mediumRectangle']);
	}
});

var LargeAdWidget = IObjectWidget.extend({
	style: WidgetStyles.plain,
	renderItem: function(jq, obj, id) {
	    AdSense.place(jq, ['largeRectangle']);
	}
});

var TallAdWidget = IObjectWidget.extend({
	style: WidgetStyles.plain,
	renderItem: function(jq, obj, id) {
	    AdSense.place(jq, ['wideSkyscraper']);
	}
});

var WideBarAdWidgetSpecial = IObjectWidget.extend({
    style: WidgetStyles.plain,
    renderItem: function(jq, obj, id) {
        var s = '<div style="width: 940px; height:90px; margin: 0 106px 0 106px; padding-bottom: 5px;" align="center">';
        s += '<div class="google-placeholder" source="adframe-wide-bar" style="float: left; width: 728px; height: 90px;">Ad: wideBar</div>';
        s += '</div>';
        jq.append(s);
        AdSense.show();
    }
});

var HideAdsWidget = IObjectWidget.extend({
	style: WidgetStyles.plain,
	renderItem: function(jq, obj, id) {
	    AdSense.hide();
	}
});

var Gap90Widget = IObjectWidget.extend({
    style: WidgetStyles.plain,
    renderItem: function(jq, obj, id) {
        jq.append('<div style="height:95px">&nbsp;</div>');
    }
});


// source: ../www.onverse.com/Website/web/js/onverse/widgets/friendWidgets.js


//
// Widget for getting referral code to send to people to get credit.
//
var InviteFriendsCodeWidget = {};

InviteFriendsCodeWidget.sendEmail = function() {
    var ajaxArgs = {
        email:   $('#inviteFromEmail').val(),
        send:    $('#inviteEmailAddresses').val()
    };    
	ajax('Sending invitations', 'invite', 'SendEmailMessages', ajaxArgs,
        function(res) {
        	if (res.success) {
        		alert('Invitations sent');
        	}
        }
    );    
};

//
// Displays ad and link to invitation page
//
var InviteFriendsAdWidget = IObjectWidget.extend({
    title: 'Invite Friends',
    renderItem: function(jq) {
	    ajaxWidget('Loading Invite Friends', '/web/html/widget/myonverse/friends/inviteFriendsAd.htm',
	        function(html) {
	            jq.html(html);
            }
        );        
    }
});

//
// Widget for searching for friends to invite on most popular social networks.
//
var InviteFriendsWidget = IObjectWidget.extend({
	title: 'Invite Friends',
    renderItem: function(jq) {
	    ajaxWidget('Loading Invite Friends', '/web/html/widget/myonverse/friends/inviteFriends.htm',
	        function(html) {
	            jq.html(html);
	            jq.find('input').keydown(function(e) {
	            	if (e.keyCode == 13) {
	            		InviteFriendsWidget.showContacts(this);
	            	}
	            });
	            jq.find('select').change(function(e) {
	            	jq.find('#email').focus();
	            });
		        ajax('Loading Invitation Providers', 'invite', 'Providers', {}, 
		            function(res) {		            	
		                if (res.success) {
		                	var s = '';
		                	for (var i in res.value.EmailProviders) {
		                		var obj = res.value.EmailProviders[i];
		                		s += '<option value="' + obj.Id +'">' + obj.Text + '</option>';
		                	}
		                	jq.find('#providerEmail').append(s);
		                }
		            }
		        );    	            
	        }
	    );
	}
});

//
// Opens a window with the results of the contact search.
//
InviteFriendsWidget.showContacts = function(caller) {
    var jqForm = $(caller).parents('#inviteFriends');
    var ajaxArgs = {
    	provider:	jqForm.find('#provider').val(),
    	email:		jqForm.find('#email').val(),
    	password:	jqForm.find('#password').val()
    };
    var windowArgs = { 
    	title: 'Invite Friends from ' + jqForm.find('#provider option:selected').text(),
    	width: '500' 
    };            
    app.openWindow('/web/html/widget/myonverse/friends/inviteResults.htm', windowArgs, function() {		        
        ajax('Reading contacts from ' + ajaxArgs.provider, 'invite', 'Contacts', ajaxArgs,
            function(res) {
                if (res.error) { // hide window if error
                    $('#inviteTableContainer').parents('.containerPlus').closeWindow();
                    return;
                }
                ajaxWidget('Formatting results', '/web/html/widget/myonverse/friends/inviteResultsTable.htm',
                    function(html) {
                        var sb = new StringBuilder();
                        for (var i in res.value.Contacts) {
                            var contact = res.value.Contacts[i];							 
                            sb.appendFormat('<tr key="{0}">', contact.Id);
                            sb.appendFormat('   <td><input type="checkbox" checked="true" /></td>');
                            sb.appendFormat('   <td>{0}</td>', contact.Name);
                            sb.appendFormat('</tr>');
                        }                        
                        html = String.format(html, sb.build());
                        $('#inviteTableContainer').html(html);                        
                        $('#inviteResultsTable').flexigrid({ height: 200,  singleSelect: true } );                                          
                        $('#inviteResults').find('#session').val(res.value.Session);
                        $('#inviteResults').find('#provider').val(ajaxArgs.provider);
                        $('#inviteResults').find('#email').val(ajaxArgs.email);
                        
                        // kinda tricky code, since checkbox is inside of a tr.
                        // clicking on the checkbox blocks onclicks for tr for 100ms
                        var checkclicked = false;
                        $('#inviteResultsTable').find('tr').click(function() {
                            if (!checkclicked) {
                        	    var cb = $(this).find('input[type="checkbox"]');
                        	    cb.attr('checked', !cb.attr('checked'));
                        	}
                        });
                        $('#inviteResultsTable').find('input[type="checkbox"]').click(function() {
                            checkclicked = true;
                            setTimeout('checkclicked = false', 100);
                        });
                    }
                );            
            }
        );  
    });  	
}

//
// Selects all of the checkboxes in the invite results.
//
InviteFriendsWidget.selectAll = function(caller) {
	$(caller).parents('#inviteResults').find('#inviteResultsTable')
		.find('input[type="checkbox"]')
			.attr('checked', true);
}

//
// Clears all of the checkboxes in the invite results.
//
InviteFriendsWidget.selectNone = function(caller) {
	$(caller).parents('#inviteResults').find('#inviteResultsTable')
		.find('input[type="checkbox"]')
			.attr('checked', false);	
}

//
// Sends the invitation
//
InviteFriendsWidget.send = function(caller) {
	var jqForm = $(caller).parents('#inviteResults');	
	var items = [];
	jqForm.find('input[type="checkbox"]').each(function() {
		if (this.checked) {
			var key = $(this).parents('tr').attr('key');
			if (key) {
				items.push(key);
			}
		}		
	});	
	var ajaxArgs = {
		email: jqForm.find('#email').val(),	
		message: jqForm.find('#message').val(),
		session: jqForm.find('#session').val(),
		provider: jqForm.find('#provider').val(),
		send: escape(items.join(','))
	};	
	
	var jqTable = jqForm.find('#inviteTableContainer');
	jqTable.html('<div style="height:200px; margin-top: 90px;" align="center">Sending Messages....</div>');
	
	ajax('Sending invitations', 'invite', 'SendMessages', ajaxArgs,
        function(res) {
        	if (res.success) {
        		jqTable.html('<div style="height:200px; margin-top: 90px;" align="center">' + res.value + '</div>');
        	}
        }
    );
}


//-------------------------------------------------------------------
var FriendProfileWidget = {};

FriendProfileWidget.addFriend = function() {
    var name = app.profileUsername;    
    if (confirm('Add avatar ' + name + ' as a friend?')) {
        ajax('Adding Friend', 'friend', 'Add', { u: name }, 
            function(res) {
                if (res.success) {
                    alert('Friend request sent to ' + name + ' for confirmation.');
                }
            }
        );    
    }      
};

FriendProfileWidget.removeFriend = function() {
    var name = app.profileUsername;    
    var id = app.profile.profileid;
    if (confirm('Remove avatar ' + name + ' from your friends?')) {
        ajax('Adding Friend', 'friend', 'Remove', { id: id }, 
            function(res) {
                if (res.success) {
                    app.reloadProfile();
                    alert('Friend removed');
                }
            }
        );    
    }      
};

if (isDefined('MailboxViewWidget') == false) {
    MailboxViewWidget = {};
}
MailboxViewWidget.sendMailSave = function(caller) {
   	var me = this;
    var wnd = $(caller).parents('.containerPlus');
    var args = {
        u: wnd.find('#rcpt').val(),
        s: wnd.find('#subject').val(),
        m: wnd.find('#message').val()
    };     
   	ajax('Sending mail message', 'chat', 'Send', args,
   	    function(res) {
   	        wnd.closeWindow();
   	    }
   	);    
};

FriendProfileWidget.compose = function() {
    var tousername = app.profileUsername;
    app.openWindow(
        '/web/html/window/compose.htm',
        { title: 'Compose New Mail' },
        function() {
            if (tousername) {
                var i = tousername.indexOf(' (');
                if (i > -1) {
                    tousername = tousername.substring(0, i);
                }
            }

            OnverseApp.AsyncData.myProfile(function(res) {
                // Build recipient DDL
                var sb = new StringBuilder();
                if (res.value) {
                    for (var k in res.value.friends) {
                        var o = res.value.friends[k];
                        var selected = o.Name == tousername ? ' selected' : ''
                        sb.appendFormat('<option value="{0}"{1}>{2}</option>', o.Name, selected, o.Name);
                    }
                }

                // Prefill fields
                var wnd = $('#composeMail');
                wnd.find('#sender').html(app.username);
                wnd.find('#rcpt').html(sb.build());
                wnd.find('#subject').focus();
                
            });
            
        }
    );
};

var FriendAlbumsWidget = {};

FriendAlbumsWidget.init = function(jq) {	
	OnverseApp.AsyncData.friendProfile(function(res) {
   	if (res && res.success) {
	   	FriendAlbumsWidget._init(jq, res.value);	   	
   	}   	
	});
};

FriendAlbumsWidget._init = function(jq, profile) {
    var sb = new StringBuilder();
    sb.appendFormat('<img class="profile-image" src="{0}" />', photomap.fullsizeUrl(profile.profile.imageid));
    jq.append(sb.build());

    for (var id in profile.photoAlbums) {
        sb = new StringBuilder();
        var obj = profile.photoAlbums[id];
        var isFirst = 1;
        for (var i in obj.photos) {
            var photo = obj.photos[i];
            if (isFirst) {
                obj.tnimageurl = photomap.thumbnailUrl(photo.imageid);
                sb.appendFormat('<div id="{0}" class="album" style="float:left">', obj.id);
                sb.appendFormat('   <a href="{0}" class="lightbox" rel="album_{2}" title="{1}">', photomap.fullsizeUrl(photo.id), photo.caption, obj.id);
                sb.appendFormat('       <img src="{0}" /><span id="album-name">{1}</span>', photomap.thumbnailUrl(photo.id), obj.name);
                sb.appendFormat('   </a>');
                sb.appendFormat('</div>');
                isFirst = 0;
            }
            else {
                sb.appendFormat('<a href="{0}" class="lightbox" rel="album_{2}" title="{1}"></a>', photomap.fullsizeUrl(photo.id), photo.caption, obj.id);
            }
        }
        jq.append(sb.build());
    }
    
    jq.append('<div class="clear"></div>');
    PhotoAlbumsWidget.buildGallery(jq);
};

var PrivateFriendWidget = IObjectWidget.extend({
	title: 'This is a Private Profile',
    links: '',
    style: WidgetStyles.plain,
    
    prerender: function(jq) {
        this.sb = new StringBuilder();	
    },
	renderItem: function(jq, obj, id) {
	    var p = app.profile;
	    if (p.privateView == true) {	  
	        this.sb.appendFormat('<div class="section"><h1>This is a Private Profile</h1>');          
	        this.sb.appendFormat('<p>Add this user as a friend to see more information.</p>');
	        this.sb.appendFormat('</div>');
	    }
	},
	postrender: function(jq) {
	    var html = this.sb.build(); 
	    if (html != '') { jq.append(html); }
	    else { this.renderEmpty(jq); }
	},
	renderEmpty: function(jq) {
        jq.parents('.section').hide();
	}
});

//-------------------------------------------------------------------
var FriendBlogWidget = {};
FriendBlogWidget.init = function(jq) {
	OnverseApp.AsyncData.friendProfile(function(res) {
   	if (res && res.success) {
	   	FriendBlogWidget._init(jq, res.value);	   	
   	}   	
	});		
};
FriendBlogWidget._init = function(jq, profile) {	
    this.sb = new StringBuilder();
    for (var id in profile.blogs) {
	    var obj = profile.blogs[id];
	    this.sb.appendFormat('<h2>');
	    this.sb.appendFormat('   {0}', obj.Title);
	    this.sb.appendFormat('   <a href="javascript:nil()" onclick="FriendBlogWidget.view(this, \'{0}\')">read</a>', id);
	    this.sb.appendFormat('</h2>');	    
    }
	 var html = this.sb.build(); 
	 if (html != '') { 
		 jq.append(html); 
	 }
	 else {
		jq.parents('.section').hide();
	 }
};

// display the blog text
FriendBlogWidget.view = function(caller, id) {
	var blog = FriendBlogWidget.getItemByID(id);  
	if (blog == null) alert('Cannot find journal ' + id);  
    var jq = $(caller);
    if (jq.html() == 'read') {
        jq.html('hide');
        var sb = new StringBuilder();
        sb.appendFormat('<div class="blog" id="blog_{0}">', id);
        sb.appendFormat(blog.Body);
        sb.appendFormat('</div>');
        jq.parent().append(sb.build());
        $('#blog_' + id).hide().slideDown();
    }
    else {            
        jq.html('read');          
        var jqb = $('#blog_' + id);
        jqb.slideUp('slow', function() { jqb.remove(); });
    }
}
FriendBlogWidget.getItemByID = function(id) {
	for (var i in app.profile.blogs) {
	    if (i == id) {
	        return app.profile.blogs[i];
	    }
	}
	return null;
}

//-------------------------------------------------------------------
var FriendVideosWidget = {};

FriendVideosWidget.init = function(jq) {	
	OnverseApp.AsyncData.friendProfile(function(res) {
   	if (res && res.success) {
	   	FriendVideosWidget._init(jq, res.value);	   	
   	}   	
	});	
};
FriendVideosWidget._init = function(jq, profile) {

	 var albums = profile.videoAlbums;
    FriendVideosWidget.ProfileVideo = null;
    FriendVideosWidget.albumCount = 0;
    
    for (var id in albums) {
	    var obj = albums[id];
	    FriendVideosWidget.albumCount++;
		 var sb = new StringBuilder();
	    var isFirst = 1;
	    for (var i in obj.videos) {
	        var video = obj.videos[i];
            if (i == profile.profile.videoid) {
                FriendVideosWidget.ProfileVideo = video;
            }	        
	        if (isFirst) {
	            obj.tnimageurl = getYoutubeThumbnail(video.url);
	            sb.appendFormat('<div id="{0}" class="album" style="float:left">', obj.id);
	            sb.appendFormat('   <a href="{0}" class="lightbox" rel="album_{2}" title="{1}">', video.url, video.name, obj.id);
	            sb.appendFormat('       <img src="{0}" /><span id="album-name">{1}</span>', getYoutubeThumbnail(video.url), obj.name);
	            sb.appendFormat('   </a>');
	            sb.appendFormat('</div>');
		        isFirst = 0;
		    }
		    else {
	            sb.appendFormat('<a href="{0}" class="lightbox" rel="album_{2}" title="{1}"></a>', video.url, video.name, obj.id);
	        }
	    }
	    jq.append(sb.build());	
	}
	
    jq.append('<div class="clear"></div>');	    

     // added photo to top
     if (FriendVideosWidget.ProfileVideo) {
         var tnurl = getYoutubeThumbnail(FriendVideosWidget.ProfileVideo.url);
         if (tnurl != null) {
             var sb = new StringBuilder();
             sb.appendFormat('<img class="profile-image" src="{0}" />', tnurl)
             jq.prepend(sb.build());
         }
     }
     if (FriendVideosWidget.albumCount == 0) {
         jq.append('<span>This avatar has no shared videos.</span>');
     }
     	    
     MyVideosWidget.buildGallery(jq);	
};




// source: ../www.onverse.com/Website/web/js/onverse/widgets/helpWidgets.js

﻿



// source: ../www.onverse.com/Website/web/js/onverse/widgets/loginWidgets.js

﻿
/*** LOGIN WIDGETS ***/

//-------------------------------------------------------------------
// Status display for onverse login user in upper right corner
//-------------------------------------------------------------------
var LoginWidget = {
	
	//
	// Loads and builds the login box.
	//
	init: function(jq) {
	    OnverseApp.AsyncData.currentLogin(function(res) {
			LoginWidget._init(jq, res.value);
	    });			
	},
	
	//
	// Builds the login box from supplied username.
	//
	_init: function(jq, username) {
	    var sb = new StringBuilder();
	    if (username) {
	        sb.appendFormat('<div id="loginPanel">')
	        sb.appendFormat('logged in as {0}<br/><br/>', username);
	        sb.appendFormat('<a href="/SignOut.aspx" onclick="LoginWidget.signout()">Sign Out</a>');
	        sb.appendFormat('</div>');
	    }
	    else {
	        sb.appendFormat('<div id="loginPanel">')
	        sb.append('You are not logged in.<br/><br/>');
	        sb.append('<a href="/signup/">Sign In</a> or <a href="/signup/">Sign Up</a> now.');
	        sb.appendFormat('</div>');
	    }
	    jq.append(sb.build());	
	},
	
	//
	// Attempts to signin the user using the values from the signup form.
	//
	signin: function() {
	    $('#error').html('');
	    ajax('Requesting signin ticket', 'auth', 'TimeStamp', null, function(res) {
	        if (res.success) {
	            var args = {
	                u: $('#username').val(),
	                p: hex_sha1(hex_sha1($('#password').val()) + res.value.Challenge),
	                t: res.value.Time,
	                remember: $('#remember').attr('checked') ? true : false
	            };
	            ajax('Signing in', 'auth', 'SignIn', args, function(res) {
	                if (res.success) {
						$('#login-error').addClass('hidden');
	                    app.clear();
	                    app.checkLogin(true);
	                }
	                else {
						$('#login-error').removeClass('hidden');
						$('#username').focus();
	                    LoginRequiredWidget.setError();
	                }
	            });
	        }
	    });
	},

	//
	// Redirects to the signout page, which deletes the login cookie.
	//
	signout: function() {
	    document.location = '/SignOut.aspx';
	}
};


//-------------------------------------------------------------------
// Signup for a new account
//-------------------------------------------------------------------
var SignupWidget = IObjectWidget.extend({
	title: 'New User Sign Up',
	style: WidgetStyles.plain,
	renderItem: function(jq, profile, id) {	
	    SignupWidget.step0(jq);
	}
});

// avatar creator
SignupWidget.step0 = function(jq) {
    SignupWidget.jq = jq;
    ajaxWidget('Loading Avatar Creator', 'web/html/widget/myonverse/signin/avatar.htm',
        function(html) {
            jq.html(removeSEO(html));
            if (app.userProfile) {
                $('#progressbar').hide();
            }            
        }
    );
}

// ask dob
SignupWidget.step1 = function(jq) {
    if (!jq) jq = SignupWidget.jq;
    
    // change panels on right
    LoginRequiredWidget.hide();
    OnverseHowtoWidget.show();
    
    ajaxWidget('Loading Sign Up Form', 'web/html/widget/myonverse/signin/signup.htm',
        function(html) {
            jq.html(html);
            //$('#signup').find('#birthday').mask("99/99/9999");
            $('#signup').find('input').keydown(function(e) {
                if (e.keyCode == 13) {
                    SignupWidget.checkBirthday();
                }
            });
        }
    );
}

// check dob
SignupWidget.checkBirthday = function() {
    //var dob = $('#signup').find('#birthday').val();
    var dob = $('#signup').find('#birthday_month').val() + '/'
        + $('#signup').find('#birthday_day').val() + '/'
        + $('#signup').find('#birthday_year').val();

    var dobUnix = Date.parse(dob).valueOf();
    var ms = new Date().valueOf() - dobUnix;
    var minutes = ms / 1000 / 60;
    var hours = minutes / 60;
    var days = hours / 24;
    var years = days / 365;

    if (String(years) == 'NaN' || dob.length < 6) {
        SignupWidget.showError('Please enter a valid date of birth.');
    }
    else if (dobUnix < -1956589200000 || years > 100) {
        SignupWidget.showError('We doubt your honesty about your age.');
    }
    else if (years < 13) {
        SignupWidget.showError('You must be at least 13 years old to access Onverse.');
    }
    else {
        SignupWidget.step2($('#signup'), dob);
    }
}

// ask for profile data
SignupWidget.step2 = function(jq, dob) {

    $('#step2 div.section').removeClass('selected');
    $('#step3 div.section').addClass('selected');

    //$('#error').remove();
    ajaxWidget('Loading Sign Up Page 2', 'web/html/widget/myonverse/signin/signup2.htm',
        function(html) {
            jq.html(html);
            fixBottomCorners();
            jq.find('#birthday').val(dob);
            var f = jq.find('#avatar');
            if (f[0]) f[0].focus();

            SignupWidget.timer = setInterval(function() {
                var pos = $('#captcha-container').offset();
                var width = $('#captcha-container').width();
                if (pos.left == 0) {
                    $('#captcha').css({ visibility: 'visible', position: 'absolute', left: -2000, top: -2000, width: width });
                    clearInterval(SignupWidget.timer);
                }
                else {
                    $('#captcha').css({ visibility: 'visible', position: 'absolute', left: pos.left, top: pos.top, width: width });
                }
            }, 2000);

            $('#signup').find('input').keydown(function(e) {
                if (e.keyCode == 13) {
                    SignupWidget.finish();
                }
            });
            $('#captcha').find('input').keydown(function(e) {
                if (e.keyCode == 13) {
                    SignupWidget.finish();
                }
            });
        }
    );
}

// create avatar
SignupWidget.finish = function() {   
    var jq = $('#signup');
    var args = {
        username: jq.find('#avatar').val(),
        password: jq.find('#password').val(),
        password1: jq.find('#password1').val(),
        email: jq.find('#email').val(),
        name: jq.find('#name').val(),
        birthday: jq.find('#birthday').val(),
        recaptcha_challenge_field: $('#captcha').find('#recaptcha_challenge_field').val(),
        recaptcha_response_field: $('#captcha').find('#recaptcha_response_field').val()
    };
    
    if (args.username.length < 4) {
        SignupWidget.showError('Avatar names must be at least 4 characters.');        
    }
    else if (args.username.indexOf('"') > -1 || args.username.indexOf("'") > -1) {
        SignupWidget.showError('Avatar names may not contain single ( \' ) or double ( " ) quotes.');        
    }
    else if (args.password != args.password1) {
        SignupWidget.showError('Passwords do not match.');    
    }
    else if (args.password.length < 6) {
        SignupWidget.showError('Passwords must be at least 6 characters.');        
    }
    else if (args.email.indexOf('@') < 1) {
        SignupWidget.showError('Email must be in the format \'user@domain.com\'.');    
    }
    else if (args.name == '') {
        SignupWidget.showError('Please supply a display name.  At least make one up.');    
    }
    else {
        // check avatar availability   
        ajax('Checking username', 'profile', 'CheckUsernameAvailable', {username: args.username},
            function(res) {                
                if (res && (res.value == true)) {
                    SignupWidget.showError('Avatar is not available.  Please choose another.');
                }          
                else if (!res.error) {                
                    ajax('Creating account', 'profile', 'CreateAccount', args,
                        function(res) {
                            if (!res.error) {
                                SignupWidget.completed();
                            }
                        }
                    );
                }
            }
        );
    }
}

SignupWidget.showError = function(msg) {
    $('#signup').find('#error').html('<div class="error">' + msg + '</div>');
}

SignupWidget.completed = function() {
    $('#captcha').css({ visibility: 'hidden', position: 'absolute', left: -2000, top: -2000 });
    clearInterval(SignupWidget.timer);

    $('#step3 div.section').removeClass('selected');
    $('#step4 div.section').addClass('selected');

    $('#error').remove();
    var jq = $('#signup');
    ajaxWidget('Loading Success Page', 'web/html/widget/myonverse/signin/signup3.htm',
        function(html) {
            jq.html(html);
            app.checkLogin(false);            
        }
    );
}

SignupWidget.enterOnverse = function() {
    app.clear();
	OnverseApp.MenuTabs.setMenu('My','Profile');
	app.checkLogin(true);
}
SignupWidget.download = function() {
    app.clear();
    OnverseApp.MenuTabs.setMenu('Home', 'Download');
    app.checkLogin();
}

//-------------------------------------------------------------------
// Lost Password Widget
//-------------------------------------------------------------------
var LostPasswordWidget = IObjectWidget.extend({
    style: WidgetStyles.plain,
    renderItem: function(jq, profile, id) {
        if (app.username == null) {
            ajaxWidget('Loading Sign In Form', 'web/html/widget/myonverse/signin/lostpassword.htm',
                function(html) {
                    jq.html(html);
                    this.jq = jq;
                    jq.find('input').keydown(function(e) {
                        if (e.keyCode == 13) {
                            LostPasswordWidget.send();
                        }
                    });
                }
            );
        }
    }
});

LostPasswordWidget.send = function() {
    var email = $('#lostpassword').find('#email').val();
    ajax('Resetting Password', 'auth', 'ResetPassword', {email: email},
        function(res) {
            if (res && res.value == true) {
                alert('Your new password has been emailed to ' + email);
            }          
        }
    );
};


//-------------------------------------------------------------------
var SetupRequiredWidget = IObjectWidget.extend({
    title: 'User Setup Required',
    renderItem: function(jq, profile, id) {
        jq.html('<p>You need to setup your avatar to continue.</p>');
    }
});


//-------------------------------------------------------------------
var OnverseHowtoWidget = IObjectWidget.extend({
    style: WidgetStyles.plain,
    renderItem: function(jq) {
        OnverseHowtoWidget.jq = jq;
    }
});

OnverseHowtoWidget.show = function() {
    ajaxWidget('Loading Video', '/web/html/widget/myonverse/signin/howto.htm',
        function(html) {
            OnverseHowtoWidget.jq.html(html);
        }
    );
};

//
// Saves the avatar and continues.
//
function saveAvatar() {
	var c = writeAvatarCookie();
    if (true || app.username == null) { // new account
		document.location = 'profile.html?avatar=' + escape(c);
//        SignupWidget.step1();
    }
/*    else { // logged in and forced to create an avatar.
		// TODO: remove this code when approved
        ajax('Creating Avatar', 'profile', 'CreateAvatar', {},
                function(res) {
                    if (res && res.value == true) {
                        alert('Avatar created successfully.  Thank you!');
                        OnverseApp.noavatar = false;
                        if (app.userProfile) {
                            app.userProfile.hasAvatar = true;
                        }
                        OnverseApp.MenuTabs.setMenu('My', 'Profile');
                    }
                }
            );
    }*/
}

//
// Fills a list of data to insert into the avatar cookie
//
var cookiePairs = [];
function setField(type, value) {
    checkForRedirect();
    cookiePairs.push(type + '=' + value);
}

//
// Stores all recieved values into a cookie.
//
function writeAvatarCookie() {
    return setCookie('avatar', cookiePairs.join('&'), 21);
}

//
// Waits until not more data has been recieved from flash, and
// redirects when nothing has been recieved within 100ms.
//
var lasthit = 0;
var checkthread = null;
function checkForRedirect() {
    function now() {
        return new Date().getTime();
    }
    lasthit = now();
    if (!checkthread) {
        checkthread = setInterval(function() {
            if (now() - lasthit > 100) {
                clearInterval(checkthread);
                checkthread = null;
                saveAvatar();
            }
        }, 100);
    }
}

//
// callbacks from flash
//
function getSexFromFlash(str) { setField('sex', str); }
function getSkintoneFromFlash(str) { setField('skin', str); setField('lips', str); }
function getShirtFromFlash(str) { setField('shirt', str); }
function getPantsFromFlash(str) { setField('pants', str); }
function getShoesFromFlash(str) { setField('shoes', str); }
function getHairFromFlash(str) { setField('hair', str); setField('haircolor', str); }
function getEyesFromFlash(str) { setField('eyes', str); }

//
// Sets a named cookie with expiration
//
function setCookie(c_name, value, expiredays) {
    ///alert(value);
    var exdate = new Date();
    exdate.setDate(exdate.getDate() + expiredays);
    document.cookie = c_name + "=" + escape(value) +
        ((expiredays == null) ? "" : ";expires=" + exdate.toGMTString());
	return value;
}
    


// source: ../www.onverse.com/Website/web/js/onverse/widgets/mailWidgets.js

﻿/*** MAILBOX WIDGETS ***/

//-------------------------------------------------------------------
var MailboxViewWidget = IObjectWidget.extend({
	title: 'Mailbox',	
    links: '<a href="javascript:nil()" onclick="MailboxViewWidget.sendMail()">compose</a>',
	renderItem: function(jq, obj, id) {
        ajaxWidget('Loading mail view', '/web/html/widget/myonverse/mailbox.htm', 
            function(html) {
                jq.html(html);
                if (jq.html() == null) return true; // reload
                MailboxViewWidget.build();
	        }
        );	
	}
});

// currently displayed mail
MailboxViewWidget.mailbox = null;

// changes to display to and from inbox and sent items
MailboxViewWidget.build = function(caller, id) {      
    if (caller) {      
        MailboxViewWidget.view = $(caller).val();
    }
    if (MailboxViewWidget.view  == 'sent') {
        MailboxViewWidget.checkMail({sent: true});
    }
    else {
        MailboxViewWidget.checkMail({sent: false});    
    }
};

// updates the mailbox view
MailboxViewWidget.buildMail = function() {
    var url = (MailboxViewWidget.view == 'sent')
        ? '/web/html/widget/myonverse/mailboxSent.htm'
        : '/web/html/widget/myonverse/mailboxInbox.htm';
    ajaxWidget('Loading mailbox viewer', url, 
        function(html) {
            $('#mailbox').html(html);	                
            $('#mailboxViewBody').html(MailboxViewWidget.buildRows());
            $('.flexgrid').flexigrid({ singleSelect: true } );	        
        }
    );       
};


// builds the table rows for loaded mail
MailboxViewWidget.buildRows = function() {
    var sb = new StringBuilder();
    if (MailboxViewWidget.view != 'sent') {
        for (var mailid in MailboxViewWidget.mailbox) {
            var mail = MailboxViewWidget.mailbox[mailid];
            sb.appendFormat(
                '<tr id="{5}" onclick="MailboxViewWidget.showMail(this, \'{3}\')" style="{4}"><td>{0}</td><td>{1}</td><td>{2}</td></tr>',
                mail.datePosted,
                mail.from,
                mail.subject,
                mail.id,
                mail.unread ? 'font-weight: bold' : 'font-weight: normal',
                mail.id                
                );		            
        }
    }
    else {
        for (var mailid in MailboxViewWidget.mailbox) {
            var mail = MailboxViewWidget.mailbox[mailid];
            sb.appendFormat(
                '<tr onclick="MailboxViewWidget.showMail(this, \'{3}\')"><td>{0}</td><td>{1}</td><td>{2}</td></tr>',
                mail.datePosted,
                mail.to,
                mail.subject,
                mail.id
                );		            
        }    
    }
    if (MailboxViewWidget.mailbox.length == 0) {
        sb.append('<tr><td>You have no mail</td></tr>');
    }
    return sb.build();    		        
};

// displays the clicked on mail message in the lower panel
MailboxViewWidget.showMail = function(caller, id) {
    var mail = null;
    for (var k in MailboxViewWidget.mailbox) {
        if (MailboxViewWidget.mailbox[k].id == id) {
            mail = MailboxViewWidget.mailbox[k];
            break;
        }
    }
    if (mail != null) {
        ajaxWidget('Loading mail message', '/web/html/widget/myonverse/mailboxMessage.htm',
            function(html) {
                var msg = mail.message;
                msg = msg.replace(/\n/g, '<br/>');
                var view = String.format(html,
                    mail.from,
                    mail.to,
                    mail.subject,
                    mail.datePosted,
                    msg,
                    mail.id
                    );
                $(caller).parents('.section')
                    .find('#mail')
                        .html(view)
                        .show();
                if (mail.unread) {
                    MailboxViewWidget.markRead(mail.id);
                }
            }
        );
    }
};

// displays a reply window
MailboxViewWidget.sendReply = function(caller) {
    var jq = $(caller).parents('#mail');
    var subject = jq.find('#subject').html();
    var body = jq.find('#body').html();
    var user = jq.find('#from').html();    
    MailboxViewWidget.sendMail('RE:' + subject, '\r\n\r\n---ORIGINAL MESSAGE---\r\n' + body, user);
};

// deletes a mail message (with confirmation box)
MailboxViewWidget.deleteMail = function(caller) {
    var jq = $(caller).parents('#mailMessageView');
    var subject = jq.find('#subject').html();
    var user = jq.find('#from').html();
    var id = jq.find('#id').val();
    if (confirm('Delete message from ' + user + ': ' + subject + '?')) {
        ajax('Deleting messages', 'chat', 'Delete', { id: id }, function(res) { MailboxViewWidget.checkMail(); });
    }
};

// Opens a window for sending a message to another avatar
MailboxViewWidget.sendMail = function(subject, body, tousername) {
	OnverseApp.AsyncData.myProfile(function(res) {
		if (res && res.success) {
			MailboxViewWidget._sendMail(res.value, subject, body, tousername);
		}
	});	
}

MailboxViewWidget._sendMail	= function(userProfile, subject, body, tousername) {

    var friendCount = 0;
    for (var k in userProfile.friends) {
        friendCount++;
    }

    if (friendCount == 0) {
        reportError(
			'Compose New Mail', 
			'You have no friends to send mail to.  Please try adding friends first.'
			);
        return;
    }

    app.openWindow(
        '/web/html/window/compose.htm', 
        { title: (!tousername || tousername == '') ? 'Compose New Mail' : 'Reply to ' + tousername },
        function() {                     
            if (tousername) {
                var i = tousername.indexOf(' (');
                if (i > -1) {
                    tousername = tousername.substring(0, i);
                }            
            }
            
            // Build recipient DLL
			var sb = new StringBuilder();
			for (var k in userProfile.friends) {
				var o = userProfile.friends[k];
				var selected = o.Name == tousername ? ' selected' : ''
                sb.appendFormat('<option value="{0}"{1}>{2}</option>', o.Name, selected, o.Name);
            }

            // Prefill fields
            var wnd = $('#composeMail');
            wnd.find('#sender').html(app.username);
            wnd.find('#rcpt').html(sb.build());
            if (tousername) {
                wnd.find('#subject').val(subject);
                wnd.find('#message').text(body);
            }
                
			// set field focus and cursor location
            if (tousername) {
                var obj = $(this).find('#message')[0];
                if (obj) {
                    obj.__Line = 0;
                    obj.__Column = 0;
                    obj.selectionStart = 0;
                    obj.selectionEnd = 0;
                    obj.focus();                
                }
            }
            else {
                wnd.find('#subject').focus();            
            }
        });    
};

// Sends the message and closes the compose window
MailboxViewWidget.sendMailSave = function(caller) {    
   	var me = this;
    var wnd = $(caller).parents('.containerPlus');
    var args = {
        u: wnd.find('#rcpt').val(),
        s: wnd.find('#subject').val(),
        m: wnd.find('#message').val()
    };     
   	ajax('Sending mail message', 'chat', 'Send', args,
   	    function(res) {
   	        wnd.closeWindow();
   	    }
   	);
};

MailboxViewWidget.markRead = function(mailid) {
    ajax('Marking mail as read', 'chat', 'MarkRead', { id: mailid },
   	    function(res) {
   	        $('#mailboxViewBody').find('tr#' + mailid).css({ fontWeight: 'normal' });
   	        app.decrementUnreadMessageCount();
   	        OnverseApp.MenuTabs.render();
   	    }
   	);
};

// load the user's current mail
MailboxViewWidget.checkMail = function(args) {
	if (!args) args = {};
    var me = this;
	ajax('Checking mail', 'chat', args.sent ? 'Sent' : 'List', args,
	    function(res) {
            MailboxViewWidget.mailbox = res.value.messages;
            MailboxViewWidget.view == args.sent ? 'sent' : 'inbox';
            MailboxViewWidget.buildMail();
	    }
	);
};


// source: ../www.onverse.com/Website/web/js/onverse/widgets/marketplaceWidgets.js

﻿
var BuyCashCoinsWidget = IObjectWidget.extend({
	title: 'Buy Cash Coins',	
	renderItem: function(jq, obj, id) {
        ajaxWidget('Loading buy cash coins', 'web/html/widget/marketplace/BuyCashCoins.htm', 
            function(html) {
                jq.html(html);
	        }
        );	
	}
});
BuyCashCoinsWidget.purchase = function(skuid) {
    if (!app.username) {
        alert('You must be logged in when purchasing Cash Coins');
    }
    else {
        ajax('Launching checkout', 'auth', 'GetPurchaseUrl', { SkuID: skuid },
            function(res) {
                document.location = res.value;
            }
        );
    }
};

var PlayerPointsWidget = IObjectWidget.extend({
    title: 'FREE Player Points',
    style: WidgetStyles.plain,
    renderItem: function(jq, obj, id) {
        ajaxWidget('Loading player points', 'web/html/widget/marketplace/PlayerPoints.htm',
            function(html) {
                jq.html(html);
            }
        );
    }
});

var GambitOffersWidget = {};

GambitOffersWidget.buildIframe = function(jq) {
    jq.html('You must be logged in to see special offers... checking login.');
    OnverseApp.AsyncData.myProfile(function(res) {
        if (res && res.value) {
            var gambitcode = 'a43656bfbf45aaf3e15f11cd31adeaae';
            var url = 'http://getgambit.com/panel?k=' + gambitcode + '&uid=' + app.username;

            if ($.browser.safari) {
                var html = '<p>Click the button to view special offers.';
                html += '<input type="button" value="View Special Offers" onclick="GambitOffersWidget.launchWindow(\'' + url + '\')"/>';
                jq.html(html);
            }
            else {
                var html = '<iframe src="' + url + '" frameborder="0" width="100%" height="300" allowtransparency="true"></iframe>';
                html = '<div style="margin-left: 10px">' + html + '</div>';
                jq.html(html);
            }
        }
    });

};

GambitOffersWidget.launchWindow = function(url) {

    var html = '<iframe src="' + url + '" frameborder="0" width="600" height="400" allowtransparency="true"></iframe>';
    html = '<div style="margin-left: 10px">' + html + '</div>';

    var w = window.open('', 'offers', 'width=630,height=410,menubar=0,toolbar=0,status=0,resizable=0');
    w.document.writeln('<html><head><title>Onverse - Gambit Special Offers</title>');
    w.document.writeln('<style>html,body{margin:0;padding:0;height:100%;overflow:hidden;}</style>');
    w.document.writeln('<link type="text/css" rel="stylesheet" href="http://www.onverse.com/web/css/onverse.css" />');
    w.document.writeln('<link type="text/css" rel="stylesheet" href="http://www.onverse.com/web/css/layout.css" />');
    w.document.writeln('</head><body>');
    w.document.writeln('<div id="wrapper">'+html+'</div>');
    w.document.writeln('</body></html>');
    w.document.close();
    //alert(url);
}

var GambitPayByPhoneWidget = {};

GambitPayByPhoneWidget.buildIframe = function(jq) {

    jq.html('You must be logged in to use pay by phone... checking login.');
    OnverseApp.AsyncData.myProfile(function(res) {
        if (res && res.value) {
            var html = '';
            var gambitcode = 'dff658d031901c075c18952d6ebca351';
            var url = 'http://getgambit.com/pay_by_phone?k=' + gambitcode + '&uid=' + app.username;
            html += '<p>Click the button to get started with your pay by phone order.';
            html += '<input type="button" value="Pay By Phone" onclick="window.open(\'' + url + '\')"/>';
            var url2 = 'http://getgambit.com/panel?k=' + gambitcode + '&uid=' + app.username;
            var html2 = '<iframe src="' + url2 + '" frameborder="0" width="100" height="100" style="display:none" allowtransparency="true"></iframe>';
            jq.html(html2 + html);
        }
    });
}


var SuperRewardsOffersWidget = {};


SuperRewardsOffersWidget.buildIframe = function(jq) {
    jq.html('You must be logged in to see special offers... checking login.');
    OnverseApp.AsyncData.myProfile(function(res) {
        if (res && res.value) {
            var superRewardCode = 'lkkeyjnmtm.122092533589';
            var uid = res.value.profileid;
            var url = 'http://www.offers-kitnmedia.com/super/offers?h=' + superRewardCode + '&uid=' + uid;


//<iframe src="http://super.kitnmedia.com/super/offers?h=lkkeyjnmtm.122092533589&uid=[USER ID]" frameborder="0" width="728" height="2400" scrolling="no"></iframe>

            /*if ($.browser.safari) {
            var html = '<p>Click the button to view special offers.';
            html += '<input type="button" value="View Special Offers" onclick="GambitOffersWidget.launchWindow(\'' + url + '\')"/>';
            jq.html(html);
            }
            else {*/
            var html = '<iframe src="' + url + '" frameborder="0" width="728" height="400" allowtransparency="true"></iframe>';
            html = '<div style="margin-left: 10px">' + html + '</div>';
            jq.html(html);
            //}
        }
    });

};



// source: ../www.onverse.com/Website/web/js/onverse/widgets/menuWidgets.js

﻿/*** MENU WIDGETS ***/

// draws a tab
function tablink(args) {
    if (!args) return tablink({text:'', title:'', hash: ''});
    
    var href;
    if (args.url) {
        href = 'href="' + args.url + '" target="_blank"';
    }
    else if (args.link) {
        href = 'href="' + args.link + '" ';    
    }
    else {
        href = 'href="#' + args.hash + '" rel="history"';
    }
        
    var sb = new StringBuilder();
    sb.appendFormat('<li{0}>', args.selected ? ' class="selected"' : '');
    sb.appendFormat('   <a {0} title="{1}">', href, args.title);
    sb.appendFormat('       <span class="l"></span>');
    sb.appendFormat('       <span>{0}</span>', args.text);
    sb.appendFormat('       <span class="r"></span>');
    sb.appendFormat('   </a>');
    sb.appendFormat('</li>');
    return sb.build();
}

//-------------------------------------------------------------------
// Draws top menu tabs
var MainMenuWidget = IObjectWidget.extend({
    title: 'Main Menu',
    style: WidgetStyles.plain,
    renderItem: function(jq, data, id) {
        if (app == null) return;
        var menu = OnverseApp.MenuTabs.getCurrentMenu();

        var sb = new StringBuilder();
        sb.append('<ul>');
        for (var k in data) {
            // don't show certain tabs if not logged in
            if (k == 'My' || k == 'Marketplace') {
                if (app.username == null) {
                    continue;
                }
            }
            if (data[k].link) {
                sb.append(tablink({
                    text: data[k].text, title: data[k].text,
                    link: data[k].link,
                    selected: data[k] == menu
                }));
            }
            else {
                sb.append(tablink({
                    text: data[k].text, title: data[k].text,
                    hash: '/' + k + '/',
                    selected: data[k] == menu
                }));
            }
        }
        sb.append('</ul>');
        jq.append(sb.build());
    }
});

//-------------------------------------------------------------------
// Draws submenu below tabs
var SubTabWidget = IObjectWidget.extend({
    title: 'Sub Menu',
    style: WidgetStyles.plain,
    renderItem: function(jq, data, id) {
        var menu = OnverseApp.MenuTabs.currentMenu;
        var tab = OnverseApp.MenuTabs.currentTab;

        var sb = new StringBuilder();
        sb.append('<ul>');
        for (var k in data) {
            if (k.indexOf('__') == 0) continue;
            // Don't display signin when signed in
            if (k == 'Sign In') {
                if (app.username != null) {
                    continue;
                }
            }
            if (k == 'My Avatar' && !OnverseApp.noavatar) {
                continue;
            }
            if (k == 'Download' && app.username == null) {
                continue;
            }

            if (data[k].indexOf('http') == 0) {
                sb.append(tablink({
                    text: k, title: k,
                    url: data[k],
                    selected: data[k] == tab
                }));
            }
            else if (k == 'Mailbox') {
                var count = app.getUnreadMessageCount();
                var text = (count > 0) ? '<b>' + k + ' (' + count + ')</b>' : k;
                sb.append(tablink({
                    text: text, title: k,
                    hash: '/' + menu + '/' + data[k] + '/',
                    selected: data[k] == tab
                }));
            }
            else if (k == 'Friends') {
                var count = app.getFriendRequestCount();
                var text = (count > 0) ? '<b>' + k + ' (' + count + ')</b>' : k;
                sb.append(tablink({
                    text: text, title: k,
                    hash: '/' + menu + '/' + data[k] + '/',
                    selected: data[k] == tab
                }));
            }
            else {
                sb.append(tablink({
                    text: k, title: k,
                    hash: '/' + menu + '/' + data[k] + '/',
                    selected: data[k] == tab
                }));
            }
        }
        sb.append(tablink()); // add dotted line at end
        sb.append('</ul>');
        jq.append(sb.build());
    }
});

// source: ../www.onverse.com/Website/web/js/onverse/widgets/messageBoardWidgets.js

﻿//
// File:    messageBoardWidgets.js
// Author:  Scott Mitting
// Date:    March 2009
// Abstract:
//  Implements widgets for message boards on both my profile and 
//  friends' profiles.
//

//-------------------------------------------------------------------
// Widget Definitions
//-------------------------------------------------------------------

// Renders comments on My Profile
var MessageBoardWidget = IObjectWidget.extend({
	title: 'Comments',
	links: '<a href="javascript:nil()" onclick="MessageBoardWidget.post()">post comment</a>',
	renderItem: function(jq, obj, id) {	
	    MessageBoardWidget.load(jq);
    },
	renderEmpty: function(jq) {
        jq.append('<span>Your message board is empty.</span>');
	}
});
// Renders comments on a friend's profile page
var FriendMessageBoardWidget = IObjectWidget.extend({
	title: 'Comments',
	links: '<a href="javascript:nil()" onclick="FriendMessageBoardWidget.post()">post comment</a>',
	renderItem: function(jq, obj, id) {		    
	    if (!app.userProfile) {
	        this.links = '';
	    }
	    else if (app.profile.privateView) {
	        jq.parents('.section').hide();
	    }
	    else {
	        FriendMessageBoardWidget.load(jq);
	    }
	}
	/*,
	renderEmpty: function(jq) {
            jq.append('<span>Be the first to post!</span>');
	}*/
});

//-------------------------------------------------------------------
// GUI Event Handlers
//-------------------------------------------------------------------

// Opens a window to post a comment to yourself
MessageBoardWidget.post = function() {
    app.openWindow(
        '/web/html/window/boardPostSelf.htm', 
        { title: 'Post Comment' },        
        function() {
            $('#boardPost').find('#id').val(app.userProfile.profile.Avatar);
            $('#boardPost').find('#message').focus();            
        });        
};
// Opens a window to reply to a friend's comment
MessageBoardWidget.postReply = function(id) {
    app.openWindow(
        '/web/html/window/boardPostSelf.htm', 
        { title: 'Post Reply To ' + id },        
        function() {
            $('#boardPost').find('#id').val(id);
            $('#boardPost').find('#message').focus();            
        });        
};
// Opens a window to edit an existing comment to a friend
FriendMessageBoardWidget.editComment = function(id, txt) {
    app.openWindow(
        '/web/html/window/boardPostEdit.htm', 
        { title: 'Edit Comment' },
        function() {                        
            $('#boardPost').find('#id').val(app.profile.profile.Avatar);
            $('#boardPost').find('#messageBoardID').val(id);
            $('#boardPost').find('#message').val(unescape(txt)).focus();            
        });        
};
// Opens a window to post a new comment to a friend
FriendMessageBoardWidget.post = function() {
    app.openWindow(
        '/web/html/window/boardPost.htm', 
        { title: 'Post Comment' },
        function() {                        
            $('#boardPost').find('#id').val(app.profile.profile.Avatar);
            $('#boardPost').find('#message').focus();            
        });        
};

//-------------------------------------------------------------------
// Ajax Event Handlers
//-------------------------------------------------------------------

// Loads a page of comments from the server
MessageBoardWidget.load = function(jq, page) {
    MessageBoardWidget.jq = jq; // save for later
    if (!page) page = 1;
    
	OnverseApp.AsyncData.myProfile(function(res) {
		app.userProfile = res.value;
	    	
	    var args = { id: app.userProfile.profileid, index: (page - 1) * 10 };
	    ajax('Loading comments', 'comment', 'List', args,
	        function(res) {            
	            jq.html('');
	            if (res.value.length == 0) {
	                jq.append('<span>Be the first to post!</span>');
	            }
	            for (var i in res.value) {
	                MessageBoardWidget.renderOne(jq, res.value[i]);
	            }
	            if (page > 1 || res.value.length >= 10) {
	                MessageBoardWidget.addPaging(jq, page, res.value.length, 'MessageBoardWidget');
	            }
	        }
	    );    
 	});
};
// Loads a page of comments from the server
FriendMessageBoardWidget.load = function(jq, page) {
    FriendMessageBoardWidget.jq = jq; // save for later
    if (!page) page = 1;
    var args = { id: app.profile.profileid, index: (page - 1) * 10 };
    ajax('Loading comments', 'comment', 'List', args,
        function(res) {            
            jq.html('');
            if (res.value.length == 0) {
                jq.append('<span>Be the first to post!</span>');
            }
            for (var i in res.value) {
                FriendMessageBoardWidget.renderOne(jq, res.value[i]);
            }
            if (page > 1 || res.value.length >= 10) {
                MessageBoardWidget.addPaging(jq, page, res.value.length, 'FriendMessageBoardWidget');
            }            
        }
    );    
};
// Removes a comment on my profile.
MessageBoardWidget.deleteComment = function(id) {
    if (confirm('Delete comment?')) {
        ajax('Deleting comment', 'comment', 'Remove', {id: id},
            function(res) {
	            if (res.success) { 
		               document.location = '' + document.location;
	            }            
            }
        );        
    }
};
// Saves a comment to one's self.
MessageBoardWidget.postSave = function(caller) {
    var profile = app.profile;
    var wnd = $(caller).parents('.containerPlus');    
    var args = {
        u: wnd.find('#id').val(),
        m: wnd.find('#message').val()
    };            
    ajax('Posting to my comments', 'comment', 'Post', args,
        function(res) {
	        if (res.success) { 
	            wnd.closeWindow(); 
               document.location = '' + document.location;
	        }            
        }
    );    
};
// Posts a new comment to a friend
FriendMessageBoardWidget.postSave = function(caller) {
    var profile = app.profile;
    var wnd = $(caller).parents('.containerPlus');    
    var args = {
        u: wnd.find('#id').val(),
        m: wnd.find('#message').val()
    };        
    ajax('Posting to friend\'s comments', 'comment', 'Post', args,
        function(res) {
	        if (res.success) { 
	            wnd.closeWindow(); 
               document.location = '' + document.location;
	        }            
        }
    );
};
// Saves changes to a comment posted to a friend
FriendMessageBoardWidget.editSave = function(caller) {
    var profile = app.profile;
    var wnd = $(caller).parents('.containerPlus');    
    var args = {
        u: wnd.find('#id').val(),
        m: wnd.find('#message').val(),
        id: wnd.find('#messageBoardID').val()
    };        
    ajax('Posting to friend\'s comments', 'comment', 'Post', args,
        function(res) {
	        if (res.success) { 
	            wnd.closeWindow(); 
               document.location = '' + document.location;
	        }            
        }
    );
};
// Removes a comment on my profile.
FriendMessageBoardWidget.deleteComment = function(id) {
    if (confirm('Delete comment?')) {
        ajax('Deleting comment', 'comment', 'Remove', { id: id },
            function(res) {
                if (res.success) {
		               document.location = '' + document.location;
                }
            }
        );
    }
};

//-------------------------------------------------------------------
// Content Rendering
//-------------------------------------------------------------------

// Draws one comment to the web page
MessageBoardWidget.renderOne = function(jq, o) {
    var id = o.Key;
    var obj = o.Value;

    // split words longer than 40 characters
    obj.text = obj.text.replace(/(\w{30})/g, "$1 ");

    var sb = new StringBuilder();
    sb.appendFormat('<table class="board" style="width: 99%; border-bottom: 1px dotted #fff">');
    sb.appendFormat('   <tr>');
    sb.appendFormat('       <td colspan="2" class="from">');
    sb.appendFormat('           <span style="float: right">{0}</span>', obj.datePosted);
    sb.appendFormat('           From {0}', obj.from);
    sb.appendFormat('       </td>');
    sb.appendFormat('   </tr>');
    sb.appendFormat('   <tr>');
    sb.appendFormat('       <td width="64" onclick="">');
    sb.appendFormat('           <a href="#profiles/{0}">', obj.avatar);
    sb.appendFormat('           <img src="{0}" width="64" height="64" border="0" />', photomap.profilethumbUrl(obj.imageid));
    sb.appendFormat('           </a>');
    sb.appendFormat('       </td>');
    sb.appendFormat('       <td class="text" width="99%" align="left">');
    sb.appendFormat('           {0}', obj.text);
    sb.appendFormat('       </td>');
    sb.appendFormat('   </tr>');
    sb.appendFormat('   <tr>');
    sb.appendFormat('       <td colspan="2" class="from">');
    sb.appendFormat('           <table><td>');
    sb.appendFormat('               <div class="editlink">');
    sb.appendFormat('                   <a href="javascript:nil()" onclick="MessageBoardWidget.postReply(\'{0}\')">reply</a>', obj.avatar);
    sb.appendFormat('                   <span></span>');
    sb.appendFormat('               </div>');
    sb.appendFormat('               </td><td>');
    sb.appendFormat('               <div class="editlink">');
    sb.appendFormat('                   <a href="javascript:nil()" onclick="MessageBoardWidget.deleteComment(\'{0}\')">delete comment</a>', id);
    sb.appendFormat('                   <span></span>');
    sb.appendFormat('               </div>');
    sb.appendFormat('           </td></table>');
    sb.appendFormat('       </td>');
    sb.appendFormat('   </tr>');
    sb.appendFormat('</table>');
    jq.append(sb.build());
};
// Draws one comment on a friend profile page
FriendMessageBoardWidget.renderOne = function(jq, o) {
    var id = o.Key;
    var obj = o.Value;
    var sb = new StringBuilder();
    sb.appendFormat('<table class="board" style="width: 99%; border-bottom: 1px dotted #fff">');
    sb.appendFormat('   <tr>');
    sb.appendFormat('       <td colspan="2" class="from">');
    sb.appendFormat('           <span style="float: right">{0}</span>', obj.datePosted);
    sb.appendFormat('           From {0}', obj.from);
    sb.appendFormat('       </td>');
    sb.appendFormat('   </tr>');
    sb.appendFormat('   <tr>');
    sb.appendFormat('       <td width="64" onclick="">');
    sb.appendFormat('           <a href="#profiles/{0}">', obj.avatar);
    sb.appendFormat('           <img src="{0}" width="64" height="64" border="0" />', photomap.profilethumbUrl(obj.imageid));
    sb.appendFormat('           </a>');
    sb.appendFormat('       </td>');
    sb.appendFormat('       <td class="text" width="99%" align="left">');        

    if (obj.avatar == app.username) {        
        sb.appendFormat('           <div style="float: right">');
        sb.appendFormat('               <div class="editlink">');
        sb.appendFormat('                   <a href="javascript:nil()" onclick="FriendMessageBoardWidget.editComment(\'{0}\', \'{1}\')">edit</a>', id, escape(obj.text));
        sb.appendFormat('                   <span></span>');
        sb.appendFormat('               </div>');
        sb.appendFormat('               <div class="editlink">');
        sb.appendFormat('                   <a href="javascript:nil()" onclick="FriendMessageBoardWidget.deleteComment(\'{0}\')">delete comment</a>', id);
        sb.appendFormat('                   <span></span>');
        sb.appendFormat('               </div>');
        sb.appendFormat('           </div>');
    }
    
    sb.appendFormat('           {0}', obj.text);
    sb.appendFormat('       </td>');
    sb.appendFormat('   </tr>');        
    sb.appendFormat('</table>');
    jq.append(sb.build());
};
// Builds a button
function button(cmd, txt, style) {
    var sb = new StringBuilder();
    sb.appendFormat('<div class="editlink" style="{0}">', style);
    sb.appendFormat('  <a href="javascript:nil()" onclick="{0}">{1}</a>', cmd, txt);
    sb.appendFormat('  <span></span>');
    sb.appendFormat('</div>');    
    return sb.build();
}
// Adds the pager to either message board widget
MessageBoardWidget.addPaging = function(jq, page, count, type) {
    var sb = new StringBuilder();   
    sb.appendFormat('<div class="pager" align="center">');
    if (page > 1) {
        var p = page - 1;
        sb.appendFormat(' <div class="prev" onclick="{0}"></div>', type + '.load(' + type + '.jq, ' + p + ')');
    }
    else {
        sb.appendFormat(' <div class="off"></div>');
    }    
    sb.appendFormat(' <div>Page {0}</div>', page);
    if (count == 10) {
        var p = page + 1;
        sb.appendFormat(' <div class="next" onclick="{0}"></div>', type + '.load(' + type + '.jq, ' + p + ')');
    }
    else {
        sb.appendFormat(' <div class="off"></div>');
    }
    sb.appendFormat('</div>');
    sb.appendFormat('<div class="clear"></div>');
    
    jq.append(sb.build());
};

// source: ../www.onverse.com/Website/web/js/onverse/widgets/photoWidgets.js


var PhotoAlbumsWidget = {};

PhotoAlbumsWidget.init = function(jq) {
	var albums = [];
	OnverseApp.AsyncData.myProfile(function(res) {
	   if (res && res.success) {
			PhotoAlbumsWidget._init(jq, res.value);
		}
	});	
};

PhotoAlbumsWidget._init = function(jq, userProfile) {
	
	var albums = userProfile.photoAlbums;
	var column = 0;
		
   var sb = new StringBuilder();
   sb.append('<table align="center"><tr>');
	for (var ai in albums) {
		var obj = albums[ai];
		var isFirst = 1;
		for (var i in obj.photos) {
			var photo = obj.photos[i];
			if (isFirst) {
				sb.appendFormat('<td id="{0}" class="album" valign="top">', obj.id);
				sb.appendFormat('   <a href="{0}" class="lightbox" rel="album_{2}" title="{1}">', photomap.fullsizeUrl(photo.id), photo.caption, obj.id);
				sb.appendFormat('       <img src="{0}" /><span id="album-name">{1}</span>', photomap.thumbnailUrl(photo.id), obj.name);
				sb.appendFormat('   </a>');
				sb.appendFormat('</td>');
				isFirst = 0;
			}
			else {
				sb.appendFormat('<a href="{0}" class="lightbox" rel="album_{2}" title="{1}"></a>', photomap.fullsizeUrl(photo.id), photo.caption, obj.id);
			}
		}
		if (isFirst == 1) { //i.e there were no photos
			sb.appendFormat('<td id="{0}" class="album" valign="top">', obj.id);
			sb.appendFormat('   <a href="{0}" class="lightbox" rel="album_{2}" title="{1}">', '/web/css/gfx/camera-icon.jpg', 'Empty Album', obj.id);
			sb.appendFormat('       <img src="{0}" /><span id="album-name">{1}</span>', '/web/css/gfx/camera-icon.jpg', obj.name);
			sb.appendFormat('   </a>');
			sb.appendFormat('</td>');
		}
		// start new row after 2 albums
		column++;
		if (column > 2) {
			column = 0;
			sb.append('</tr><tr>');
		}	
	}		
	sb.append('</tr></table>');
	sb.append('<div class="clear"></div>');
	jq.append(sb.build());
		
	// added photo to top	
	sb = new StringBuilder();
	sb.appendFormat('<img class="profile-image" src="{0}" />', photomap.fullsizeUrl(userProfile.profile.imageid));
	jq.prepend(sb.build());

	// build image galleries
	PhotoAlbumsWidget.buildGallery(jq);	
}

//
// Initializes a photo gallery from a parent element
//
// Arguments:
//  jq          -   jquery reference for section
//
PhotoAlbumsWidget.buildGallery = function(jq, options) {
    jq.find('a.lightbox').each(function() {
        var $this = $(this);
        var albumdata = [];
        $("a[rel='" + $this.attr('rel') + "']").each(function() {
            albumdata.push({ img: this.href, title: $(this).attr('title') });
        });
        $this.bind('click', function() {
            try { PhotoAlbumsWidget.show($this.find('#album-name').text(), albumdata, options); }
            catch (ex) { }
            return false;
        });
    });
};

//
// Displays a photo gallery in a popup window
//
// Arguments:
//  title       - text to display for window title
//  albumdata   - gallery to display
//  options     - (optional) overrides option data directly
//
PhotoAlbumsWidget.show = function(title, albumdata, options) {

    // process arguments
    var o = {
        container: 'wnd_' + String(Math.random()).substring(3),
        style: 'top:100px;left:0px;display:none;',
        title: 'Window',
        width: '850',
        icon: 'browser.png',
        skin: 'black',
        align: 'center'
    };
    if (options) {
        for (var i in options) {
            o[i] = options[i];
        }
    }

    // create window contents
    var html = '';
    html +=
        '<table width="100%" class="album-pager">' +
        '<td align="left" width="25%"><a href="javascript:nil()" id="album-prev">&lt; Previous</a></td>' +
        '<td align="center" width="50%" id="album-page">loading...</td>' +
        '<td align="right" width="25%"><a href="javascript:nil()" id="album-next">Next &gt;</a></td>' +
        '</table>';

    html += '<img id="album-image" src="/images/lightbox-ico-loading.gif"/>';
    html += '<p id="album-caption"></p>';

    // create window
    var sb = new StringBuilder();
    sb.appendFormat('<div id="{0}" class="containerPlus draggable" width="{1}" style="{2}" buttons="m,c" icon="{3}" skin="{4}" minimized="false">', o.container, o.width, o.style, o.icon, o.skin);
    sb.appendFormat('   <div class="no"><div class="ne"><div class="n">&nbsp;&nbsp;{0}</div></div>', title);
    sb.appendFormat('       <div class="o"><div class="e"><div class="c"><div class="content" align="center">{0}</div></div></div></div>', html);
    sb.appendFormat('		<div><div class="so"><div class="se"><div class="s"></div></div></div></div>');
    sb.appendFormat('   </div>');
    sb.appendFormat('</div>');
    $('#windowContainer').append(sb.build());

    // display window and load contents
    var $wnd = $('#' + o.container);
    if (o.align == 'center') {
        $wnd.buildContainers({ containment: "document", elementsPath: "/web/css/elements/" })
           .css('height', '650px').centerInClient()
           .fadeIn()
		   ;
    }
    else {
        $wnd.buildContainers({ containment: "document", elementsPath: "/web/css/elements/" })
           .css('height', '650px')
           .fadeIn()
		   ;
    }

    // image events
    var lastimage = 0;
    function showImageNumber(i) {
        if (i >= albumdata.length) i = 0;
        else if (i < 0) i = albumdata.length - 1;
        lastimage = i;
        $wnd.find('#album-page').text('Image ' + (i + 1) + ' of ' + albumdata.length);
        $wnd.find('#album-caption').text(albumdata[i].title);

        $wnd.find('#album-image').attr('src', 'images/lightbox-ico-loading.gif');
        $wnd.find('#album-image').attr('src', albumdata[i].img);
    }
    showImageNumber(0);
    $('#' + o.container).find('#album-next').click(function() { showImageNumber(lastimage + 1); });
    $('#' + o.container).find('#album-prev').click(function() { showImageNumber(lastimage - 1); });
};

/**** NEW PHOTO MANAGER ****/

PhotoAlbumsWidget.manager = function() {
    var args = { title: 'Manage Photos', width: '750' };
    app.openWindow('/web/html/window/photoManager.htm', args, function() {

        PhotoManager.build();

        $('#photoUpload').fileUpload({
            'uploader': '/web/swf/uploader.swf',
            'cancelImg': '/web/css/cancel.png',
            'buttonText': 'Upload Photos',
            'scriptAccess': 'always',
            'scriptData': { ticket: app.userProfile.ticket, albumid: PhotoManager.albumid },
            'folder': '',
            'script': '/json/upload.ashx',
            'fileDesc': 'Image Files',
            'fileExt': '*.jpg;*.jpeg;*.gif;*.png;*.bmp;',
            'onComplete': function() {
                PhotoManager.reset();
            },

            // Button settings
            'buttonImg': '/web/css/gfx/blank.gif',
            'width': 63,
            'height': 63,
            'wmode': 'transparent',


            'multi': true,
            'auto': true
        });






    });
};


var PhotoManager = {};


//-------------------------------------------------------------------
// Album Editing
//-------------------------------------------------------------------

PhotoManager.newAlbum = function(ref) {
    var jq = $('#photoEditMask');
    jq.find('#contents').html($('#photo-add-album-template').html());
    jq.show();
}

PhotoManager.cancelNewAlbum = function(ref) {
    var jq = $(ref).parents('.editmask');
    jq.hide();
}

PhotoManager.saveNewAlbum = function(ref) {
    var jq = $(ref).parents('.editmask');
    var args = { name: jq.find('#albumName').val() };
    ajax('Creating new photo album', 'profile', 'EditAlbum', args,
        function(res) {
            jq.hide();            
            for (var id in app.userProfile.photoAlbums) {
                PhotoManager.setUploadFolder(id);
                break;
            }            
            PhotoManager.reset();
        }
    );
    }

PhotoManager.showEditAlbum = function(ref) {
    var jq = $(ref).parents('.album-title');
    jq.addClass('selected');
    jq.find('#name').val(jq.find('label').text());
}

PhotoManager.saveEditAlbum = function(ref) {
    var jq = $(ref).parents('.album-title');
    var args = {
        id: jq.find('#albumID').val(),
        name: jq.find('#name').val()
    };
    ajax('Saving photo album changes', 'profile', 'EditAlbum', args, function(res) {
        PhotoManager.reset();
    });        
    jq.removeClass('selected');
    jq.find('label').text(jq.find('#name').val());
}

PhotoManager.cancelEditAlbum = function(ref) {
    var jq = $(ref).parents('.album-title');
    jq.removeClass('selected');
}

PhotoManager.deleteAlbum = function(ref) {
    var jq = $(ref).parents('.album-title');
    if (confirm('Are you sure you want to delete this album and all photos within?')) {
        var args = { id: jq.find('#albumID').val() };
        ajax('Deleting photo', 'profile', 'DeleteAlbum', args, function(res) {
            if (args.id == PhotoManager.albumid) {
                for (var id in app.userProfile.photoAlbums) {
                    PhotoManager.setUploadFolder(id);
                    break;
                }
            }
            PhotoManager.reset();
        });
        jq.fadeOut('slow');
    }
    else {
    }
}

//
// Launches the photo album view in full size.
//
PhotoManager.viewAlbum = function(ref) {
    var jq = $(ref).parents('.album-title');
    var albumid = jq.find('#albumID').val();

    OnverseApp.AsyncData.myProfile(function(res) {
        var album = res.value.photoAlbums[albumid];

        var list = [];
        for (var id in album.photos) {
            var p = album.photos[id];
            list.push({ img: photomap.fullsizeUrl(p.id), title: p.caption });
        }
        if (list.length > 0) {
            PhotoAlbumsWidget.show('Full Size View: ' + album.name, list);
        }
        else {
            alert('Album is empty.');
        }
    });
}

PhotoManager.setUploadFolder = function(ref, id) {
    if (ref) {
        var jq = $(ref).parents('.album-title');
        PhotoManager.albumid = jq.find('#albumID').val();
    }
    else if (id) {
        PhotoManager.albumid = id;
    }
    PhotoManager.reset();
    $('#photoUpload').fileUploadSettings('scriptData', '&albumid=' + PhotoManager.albumid + '&ticket=' + app.userProfile.ticket);
}

//-------------------------------------------------------------------
// Photo Editing
//-------------------------------------------------------------------
PhotoManager.showEditPhoto = function(ref) {
    var jq = $(ref).parents('.item');
    jq.addClass('selected');
    jq.find('#text').val(jq.find('label').text());
}

PhotoManager.saveEditPhoto = function(ref) {
    var jq = $(ref).parents('.item');
    var args = {
        id: jq.find('#photoID').val(),
        caption: jq.find('#text').val()
    };
    ajax('Saving photo changes', 'profile', 'PostPhoto', args, function(res) {
        PhotoManager.reset();
    });
    jq.removeClass('selected');
    jq.find('label').text(jq.find('#text').val());
}

PhotoManager.cancelEditPhoto = function(ref) {
    var jq = $(ref).parents('.item');
    jq.removeClass('selected');
}

PhotoManager.deletePhoto = function(ref) {
    var jq = $(ref).parents('.item');
    if (confirm('Are you sure you want to delete this photo?')) {
        var args = { id: jq.find('#photoID').val() };
        ajax('Deleting photo', 'profile', 'DeletePhoto', args, function(res) {
            PhotoManager.reset();
        });        
        jq.fadeOut('slow');		            
    }
    else {
    }
}

PhotoManager.setProfilePhoto = function(ref) {
    var jq = $(ref).parents('.item');
    var id = jq.find('#photoID').val();
    var avatar = app.userProfile.profile.Avatar;
    ajax('Saving profile image', 'profile', 'Edit', { u: avatar, image: id },
        function(res) {
            app.userProfile.profile.imageid = id;
            PhotoManager.reset();
        }
    );
}

//-------------------------------------------------------------------
// Preview Size
//-------------------------------------------------------------------

PhotoManager.setPhotoSize = function(size) {
    PhotoManager.lastsize = size;
    $('.photo-manager .item').css({ width: size });
    $('.photo-manager .item img.image').css({ width: size });
    if (size < 100) {
        $('.photo-manager tr.viewrow').css({ display: 'none' });
    }
    else {
        $('.photo-manager tr.viewrow').css({ display: '' });
    }
}

PhotoManager.initPhotoSize = function() {
    if (!PhotoManager.lastsize)
        PhotoManager.lastsize = 100;
    $("#slider").slider({
        min: 25, max: 150, value: PhotoManager.lastsize,
        slide: function(event, ui) {
            PhotoManager.lastsize = ui.value;
            PhotoManager.setPhotoSize(ui.value);
        }
    });
    PhotoManager.setPhotoSize(PhotoManager.lastsize);
}

//-------------------------------------------------------------------
// Data binding
//-------------------------------------------------------------------

// clears the photo list cache and rebuilds the view
PhotoManager.reset = function() {
    OnverseApp.AsyncData.resetAll();
    PhotoManager.build();
}


PhotoManager.build = function() {
    OnverseApp.AsyncData.myProfile(function(res) {
        var albumList = res.value.photoAlbums;
        var albumTpl = $('#album-template').html()
            .replace(/\%7B/g, '{')
            .replace(/\%7D/g, '}')
            ;
        var photoTpl = $('#item-template').html()
            .replace(/\%7B/g, '{')
            .replace(/\%7D/g, '}')
            ;
        var sb = new StringBuilder();
        for (var albumID in albumList) {
            if (!PhotoManager.albumid) {
                PhotoManager.albumid = albumID;
            }
            var album = albumList[albumID];
            var albumStatus = '';
            var albumClass = '';
            var checkbox = '';
            if (albumID == PhotoManager.albumid) {
                albumStatus = 'uploading to this album';
                albumClass = 'selected';
                checkbox = '<img id="check" src="/web/css/gfx/checkbox-icon.jpg" border="0" width="37" height="30" class="delete" />';
            }
            sb.appendFormat(albumTpl, album.id, album.name, albumStatus, albumClass, checkbox);
            sb.appendFormat('<div class="album-drop" style="min-height: 100px; width: 99%;">');
            sb.appendFormat('<input type="hidden" id="albumID" value="{0}" />', album.id);
            var hasphoto = false;
            for (var pindex in album.photos) {
                var photo = album.photos[pindex];
                var caption = photo.caption;
                if (photo.id == app.userProfile.profile.imageid) {
                    caption += '<br/><b>profile photo</b>';
                }
                sb.appendFormat(photoTpl, photomap.profilethumbUrl(photo.id), photo.id, caption);
                hasphoto = true;
            }
            if (!hasphoto) {
                sb.appendFormat('<p style="color: black;">This album is empty</p>');
            }
            sb.appendFormat('</div>');
        }
        $('.photo-manager').html(sb.build());


        PhotoManager.initPhotoSize();
        PhotoManager.initDragDrop();
    });
}

//-------------------------------------------------------------------
// Drag-drop
//-------------------------------------------------------------------

PhotoManager.initDragDrop = function() {
    // drag / drop
    $(".item").draggable({ helper: 'clone' });
    $(".album-title, .album-drop").droppable({
        accept: '.item',
        hoverClass: 'dropHover',
        drop: function(ev, ui) {
            var photo = $(ui.draggable).find('#photoID').val();
            var album = $(this).find('#albumID').val();
            ajax('Saving album change', 'profile', 'PostPhoto', { id: photo, albumid: album },
                function(res) {
                    PhotoManager.reset();
                }
            );
        }
    });
};



// source: ../www.onverse.com/Website/web/js/onverse/widgets/profileWidgets.js

﻿
/*** PROFILE WIDGETS ***/

//-------------------------------------------------------------------
var FriendNameWidget = IObjectWidget.extend({
    style: WidgetStyles.plain,
    renderItem: function(jq) {
        jq.html('<h1 style="color:#6890ea; margin: 5px;">' + app.profile.profile.Avatar + '</h1>');
    }
});
    

var MyProfileWidget = {};

// Checks to see that you don't input too many characters into a textbox
function watchCharLimit(jqParent, monitor, status, maxlength) {
    var jqField = jqParent.find(monitor);
    var jqStatus = jqParent.find(status);    
    function checknow() {
        var left = maxlength - jqField.val().length;
        if (left < 0) {
            jqField.val(jqField.val().substring(0, maxlength));
            jqStatus.html('Invalid! You may only enter ' + maxlength + ' characters!!!');
        }
        else {
            jqStatus.html(left + ' characters remaining');
        }
    }    
    jqField.keyup(checknow);
    checknow();
}

 // Editing "My Profile"
MyProfileWidget.edit = function() {
    ajaxWidget('Loading My Profile', '/web/html/window/profileEditor.htm',
        function(html) {
            MyProfileWidget.jq.html(html);

            OnverseApp.AsyncData.myProfile(function(res) {
                var profile = res.value.profile;
                var about = res.value.about;

                // fill form                
                var jq = $('#editProfile');
                jq
                .find('#avatar').html(profile.Avatar).end()
                .find('#name').val(profile.Name).end()
                .find('#sex').html(profile.Sex == 'M' ? 'Male' : 'Female').end()
                .find('#birthday').html(profile.Birthday).end()
                .find('#location').val(profile.Location).end()
                .find('#education').val(about.Education).end()
                .find('#work').val(about.Work).end()
                .find('#interests').val(about.Interests).end()
                ;
                $('#editProfile').find('#name')[0].focus();

                // character limit checking
                watchCharLimit(jq, '#name', '#nameChars', 50);
                watchCharLimit(jq, '#location', '#locationChars', 50);
                watchCharLimit(jq, '#education', '#educationChars', 500);
                watchCharLimit(jq, '#work', '#workChars', 500);
                watchCharLimit(jq, '#interests', '#interestsChars', 1250);
            });                
        }
    );
};
// saves profile changes
MyProfileWidget.save = function(caller) {
    var profile = app.userProfile;
	if (!profile) profile = {};
	if (!profile.profile) profile.profile = {};
    var wnd = $(caller).parents('.section');                 
    var args = {
        cmd: 'edit',
        u: profile.profile.Avatar,
        name: wnd.find('#name').val(),
//        image: wnd.find('#image').val(),
        location: wnd.find('#location').val(),
        education: wnd.find('#education').val(),
        work: wnd.find('#work').val(),
        interests: wnd.find('#interests').val()
    };        
	ajax('Saving my profile', 'profile', 'Edit', args, 
		function(res) {
			//app.loadMyProfile();
			document.location = '' + document.location;
		}
	);
}
// hides edit profile fields
MyProfileWidget.cancel = function(caller) {
    //app.loadMyProfile();
    document.location = '' + document.location;
}


//-------------------------------------------------------------------
var StatusWidget = IObjectWidget.extend({
    title: 'Status',
    links: '<a href="javascript:nil()" onclick="StatusWidget.edit()">edit</a>',
    prerender: function() {
    },
    renderItem: function(jq, obj, id) {
        StatusWidget.jq = jq;
        if (!obj.text) {
            this.renderEmpty(jq);
        }
        else {
            var sb = new StringBuilder();
            sb.appendFormat('<span>{0}</span>', obj.text);
            sb.appendFormat('<img class="icon" src="{0}" />', photomap.emoticon(obj.emoticon));
            sb.appendFormat('<br/><br/>');
            jq.append(sb.build());
        }
    },
    renderEmpty: function(jq) {
        jq.append('<span>This user has no status set.</span>');
    }
});
StatusWidget.edit = function() {
    ajaxWidget('Loading Edit Status', '/web/html/window/profileStatus.htm',
        function(html) {
            StatusWidget.jq.html(html);
            var profile = app.userProfile;
            ajax('Loading emoticon list', 'profile', 'Emoticons', null,
			    function(res) {
			        if (res && res.success) {
			            var html = '';
			            for (var i in res.value) {
			                var o = res.value[i];
			                html += '<option value="' + o.id + '">' + o.name + '</option>';
			            }
			            $('#editStatus').find('#emoticon').html(html);
			        }
			    }
		    );
        }
    );  
}
StatusWidget.save = function(caller) {
    var profile = app.userProfile;
	if (!profile) profile = {};
	if (!profile.profile) profile.profile = {};
    var wnd = $(caller).parents('.section');    
    var args = {
        cmd: 'edit',
        u: profile.profile.Avatar,
        status: wnd.find('#status').val(),
        emoticon: wnd.find('#emoticon').val()
    };        
	ajax('Saving status change', 'profile', 'Edit', args,
		function(res) {
		    wnd.closeWindow();
            app.loadMyProfile();			
		}
	);	
}
StatusWidget.cancel = function(caller) {
    app.loadMyProfile();
}    
	
//-------------------------------------------------------------------
var AboutWidget = IObjectWidget.extend({
    title: 'About Me',
    links: '<a href="javascript:nil()" onclick="AboutWidget.edit()">edit</a>',
    renderItem: function(jq, obj, id) {
        AboutWidget.jq = jq;
        var p = app.userProfile;
        if (p) {
            var sb = new StringBuilder();
            var value = p.about.Legacy;
            while (value.indexOf('\n') > -1) {
                value = value.replace('\n', '<br/>');
            }
            sb.appendFormat('<p>{0}</p>', value);
            jq.append(sb.build());
        }
    },
    renderEmpty: function(jq) {
        jq.append('<span>Tell others about you.</span>');
    }
});
AboutWidget.edit = function() {
    ajaxWidget('Loading About Me', '/web/html/window/profileAbout.htm',
        function(html) {
            AboutWidget.jq.html(html);
            var profile = app.userProfile;
            $('#profileAbout').find('#legacy').val(profile.about.Legacy).end();
            $('#profileAbout').find('#legacy')[0].focus();        
        }
    );    
}
AboutWidget.save = function(caller) {
    var profile = app.userProfile;
	if (!profile) profile = {};
	if (!profile.profile) profile.profile = {};
    var wnd = $(caller).parents('.section');                        
    var args = {
        u: profile.profile.Avatar,
        legacy: wnd.find('#legacy').val()
    };        
    ajax('Saving about me', 'profile', 'Edit', args, 
        function(res) {
            wnd.closeWindow(); 
            app.loadMyProfile();			
	    }
	);
}
AboutWidget.cancel = function(caller) {
    app.loadMyProfile();
}


//-------------------------------------------------------------------
// Widget for displaying "friend updates"
//-------------------------------------------------------------------
var InGameUpdatesWidget = IObjectWidget.extend({
	title: 'Friend Updates',
	renderItem:     function(jq) { InGameUpdatesWidget.load(jq, 1, 0); },
	renderEmpty:    function(jq) { jq.append('<span>You have no friend updates.</span>'); }
});

// starting index for each page
var pageindex = { 1: 0 };


function getDatePart(isodate) {
    if (!isodate) return 'NULL!';
    var i = isodate.indexOf('T');
    if (i == -1) return isodate;
    return isodate.substring(0, i);
}
function getTimePart(isodate) {
    if (!isodate) return '';
    var i = isodate.indexOf('T');
    if (i == -1) return '';
    isodate = isodate.substring(i + 1);
    i = isodate.lastIndexOf(':');
    if (i == -1) return isodate;
    return isodate.substring(0, i);
}
// converts military time to normal time
function formatTimePart(isodate) {
    var t = getTimePart(isodate);
    if (!t || t == '') return isodate;
    var split = t.indexOf(':');
    if (split == -1) return t;
    var hour = Number(t.substring(0, split));
    var minute = t.substring(split + 1);
    var newhour = hour == 0 ? 12 : hour > 12 ? hour - 12 : hour;
    var tp = hour < 12 ? 'AM' : 'PM';
    return newhour + ':' + minute + ' ' + tp;
}

//
// Loads the contents of the friend update's current page
//
InGameUpdatesWidget.load = function(jq, page, index) {
    InGameUpdatesWidget.jq = jq; // save for later
    if (!page) page = 1;
    if (!index) index = 0;
    var args = { index: index };
    ajax('Loading friend updates', 'friend', 'Updates', args,
        function(res) {
            if (res && res.success) {

                var nextPageId = 0;
                var totalItemCount = 0;
                var hasNextPage = false;

                var sb = new StringBuilder();
                var news = res.value;

                // compiled news data
                var compiled = {};
                // dates contained within compiled
                var dates = {};

                for (var i in news) {
                    var kv = news[i];
                    var id = kv.Key;
                    var obj = kv.Value;
                    var date = getDatePart(obj.datePosted);

                    // store list of dates found
                    if (!dates[date]) {
                        dates[date] = 1;
                    }

                    // add key for avatar as needed
                    if (!compiled[obj.avatar]) {
                        compiled[obj.avatar] = { imageid: obj.imageid, daily: {} };
                    }

                    // add key for this date as needed
                    if (!compiled[obj.avatar].daily[date]) {
                        compiled[obj.avatar].daily[date] = [];
                    }

                    // add item to date list                    
                    compiled[obj.avatar].daily[date].push(obj);
                }

                // number of items displayed, quit after 10 blocks
                var displayCount = 0;

                // group by date, starting with the newest
                for (var currentDate in dates) {
                    // loop through avatars with data on this date
                    for (var avatar in compiled) {
                        var data = compiled[avatar];
                        var daily = data.daily[currentDate];
                        if (!daily) continue;

                        // start daily table ("StevEO's updates on 2009-05-29")
                        sb.appendFormat('<table class="board" style="width: 100%; border-bottom: 1px dotted #fff">');
                        sb.appendFormat('   <tr>');
                        sb.appendFormat('       <td width="64" valign="top">');
                        sb.appendFormat('           <a href="#profiles/{0}">', avatar);
                        sb.appendFormat('           <img src="{0}" width="64" height="64" border="0" />', photomap.profilethumbUrl(data.imageid));
                        sb.appendFormat('           </a>');
                        sb.appendFormat('       </td>');
                        sb.appendFormat('       <td class="text" width="100%" valign="top" align="left">');
                        sb.appendFormat('           <b>{0}\'s updates on {1}</b><br/>', avatar, getDatePart(daily[0].datePosted));

                        // display daily updates, skipping duplicates
                        var alreadyShown = {};
                        function wasAlreadyShown(s) {
                            if (alreadyShown[s]) return true;
                            alreadyShown[s] = 1;
                            return false;
                        }

                        var lastid = 0;
                        for (var i in daily) {
                            var item = daily[i];
                            var text = item.text;
                            totalItemCount++;
                            if (wasAlreadyShown(text)) continue;
                            if (text.indexOf(avatar + ' ') == 0) {
                                text = text.substring(avatar.length + 1);
                            }
                            if (item.emoticon) {
                                text += ' <img src="' + photomap.emoticon(item.emoticon) + '" style="width:32px; height:32px;" />';
                            }
                            sb.appendFormat('<i>{0}</i> {1}<br/>', formatTimePart(item.datePosted), text);
                            lastid = item.id;
                        }

                        // close daily table
                        sb.appendFormat('       </td>');
                        sb.appendFormat('   </tr>');
                        sb.appendFormat('</table>');

                        // exit inner-loop early if display limit reached
                        if (++displayCount >= 10) {
                            nextPageId = lastid;
                            hasNextPage = true;
                            break;
                        }
                    }
                    // exit outer-loop early if display limit reached
                    if (displayCount >= 10) {
								break;
                    }
                }
                
                if (hasNextPage == false && totalItemCount > 10) {
                   nextPageId = lastid;
                   hasNextPage = true;	                
                }                
                
                jq.html('');
                jq.append(sb.build());
                InGameUpdatesWidget.addPaging(jq, page, index + totalItemCount + 1, hasNextPage);
            }
        }
    );
};
	
//
// Adds the pager to either message board widget
//
InGameUpdatesWidget.addPaging = function(jq, page, count, hasNext) {
    // save page index
    pageindex[page + 1] = count;
    
    var sb = new StringBuilder();
    sb.appendFormat('<div class="pager" align="center">');
    if (page > 1) {
        var p = page - 1;
        count = pageindex[p];
        sb.appendFormat(' <div class="prev" onclick="{0}"></div>', 'InGameUpdatesWidget.load(InGameUpdatesWidget.jq, ' + p + ',' + count + ')');
    }
    else {
        sb.appendFormat(' <div class="off"></div>');
    }
    sb.appendFormat(' <div>Page {0}</div>', page);
    if (hasNext) {
        var p = page + 1;
        count = pageindex[p];
        sb.appendFormat(' <div class="next" onclick="{0}"></div>', 'InGameUpdatesWidget.load(InGameUpdatesWidget.jq, ' + p + ',' + count + ')');
    }
    else {
        sb.appendFormat(' <div class="off"></div>');
    }
    sb.appendFormat('</div>');
    sb.appendFormat('<div style="clear:left;"></div>');
    jq.append(sb.build());
};	


// source: ../www.onverse.com/Website/web/js/onverse/widgets/settingsWidgets.js

﻿

function cleanTimeZone(tz) {
    var s = tz < 0 ? '-' : '';
    var h = Math.floor(tz);
    var m = Math.abs(tz) - Math.abs(h);
    if (m > .7) {
        return h + '.75';
    }
    else if (m > .4) {
        return h + '.5';
    }
    else if (m > .2) {
        return h + '.25';
    }
    else {
        return h + '.0';
    }
}
function formatTimeZone(tz) {
    var t = Number(cleanTimeZone(tz));
    var m = Math.abs(t) - Math.floor(Math.abs(t));
    var ret = 'GMT ';
    ret += (t < 0) ? '-' : '+';
    ret += Math.abs(Math.floor(t));
    if (m < .2) ret += ':00';
    else if (m < .4) ret += ':25';
    else if (m < .6) ret += ':50';
    else if (m < .8) ret += ':75';
    return ret;                                               
}

                    
//-------------------------------------------------------------------
var SettingsWidget = IObjectWidget.extend({
	title: 'Account Settings',
    links: 
        '<a href="javascript:nil()" onclick="SettingsWidget.changePassword()">change password</a>' +
        '<a href="javascript:nil()" onclick="SettingsWidget.edit()">edit</a>'
        ,	
	renderItem: function(jq) {	
	    ajaxWidget('Loading account settings form', '/web/html/widget/myonverse/settings/settingsForm.htm',
            function(html) {
                jq.html(html);       
               	OnverseApp.AsyncData.myProfile(function(res) {
                    var profile = res.value.profile;          
                    jq.find('#avatar').html(profile.Avatar);
                    jq.find('#name').html(profile.Name);
                    jq.find('#birthday').html(profile.Birthday);
                    jq.find('#email').html(profile.Email);
                    jq.find('#public').html(profile.publicProfile ? 'Public' : 'Private');
                    jq.find('#notifyMail').html(profile.notifyMail ? 'Enabled' : 'Disabled');
                    jq.find('#notifyComment').html(profile.notifyComment ? 'Enabled' : 'Disabled');
                    
                    jq.find('#notifyAnnouncements').html(profile.notifyAnnouncements ? 'Enabled' : 'Disabled');
                                                          
                    jq.find('#timezone').html(formatTimeZone(profile.timezone));
                    jq.find('#timezoneDST').html(profile.timezoneDST ? 'On' : 'Off');
                });
            }
        );	    
	}
});

SettingsWidget.edit = function() {
    var args = { title: 'Edit Account Settings', width: 550 };
    app.openWindow('/web/html/widget/myonverse/settings/settingsWindow.htm', args, function() {     
    	OnverseApp.AsyncData.myProfile(function(res) {
            var profile = res.value.profile;
            var about = res.value.about;
            
            // fill form                
            var jq = $('#editSettings');
            jq.find('#avatar').html(profile.Avatar);
            jq.find('#name').val(profile.Name);
            jq.find('#birthday').val(profile.Birthday).mask("99/99/9999");
            jq.find('#email').val(profile.Email);
            jq.find('#public').attr('checked', profile.publicProfile ? true : false);
            jq.find('#notifyMail').attr('checked', profile.notifyMail ? true : false);
            jq.find('#notifyComment').attr('checked', profile.notifyComment ? true : false);
            jq.find('#notifyAnnouncements').attr('checked', profile.notifyAnnouncements ? true : false);
            jq.find('#timezone').val(cleanTimeZone(profile.timezone));
            jq.find('#timezoneDST').attr('checked', profile.timezoneDST ? true : false);
            $('#editSettings').find('#name')[0].focus();
		});
	});	
};

SettingsWidget.save = function() {
    var jq = $('#editSettings');
    var args = {
        u: jq.find('#avatar').html(),
        name: jq.find('#name').val(),
        birthday: jq.find('#birthday').val(),
        email: jq.find('#email').val(),
        timezone: jq.find('#timezone').val(),
        publicProfile: jq.find('#public').attr('checked'),
        notifyMail: jq.find('#notifyMail').attr('checked'),
        timezoneDST: jq.find('#timezoneDST').attr('checked'),        
        notifyAnnouncements: jq.find('#notifyAnnouncements').attr('checked')
//        notifyComment: jq.find('#notifyComment').attr('checked')
    };
    var wnd = $(jq).parents('.containerPlus');                     
	ajax('Saving changed settings', 'profile', 'Edit', args, 
		function(res) {
		    wnd.closeWindow();
            app.loadMyProfile();			
		}
	);    
};

SettingsWidget.changePassword = function() {
    var args = { title: 'Change Onverse Password', icon: 'lock.png' };
    app.openWindow('/web/html/widget/myonverse/settings/passwordWindow.htm', args, 
        function() {     
	    }
	);	
};

SettingsWidget.savePassword = function() {
    var jq = $('#editPassword');
    var wnd = $(jq).parents('.containerPlus');
    var args = {
        oldpassword: jq.find('#oldpassword').val(),
        password: jq.find('#password').val(),
        password1: jq.find('#password1').val()    
    };
    // validate
    if (args.password != args.password1) {
        reportError('Changing Password', 'New passwords must match.');
        return;
    }    
    else if (args.password.length < 6) {
        reportError('Changing Password', 'Password must be at least 6 characters');
        return;
    }
    // save    
	ajax('Requesting encryption ticket', 'auth', 'TimeStamp', null, function(res) {
		if (res.success) {
			ajax('Changing password', 'auth', 'ChangePassword', encryptArgs(args, res.value.Time, res.value.Challenge), 
			    function(res) {
				    if (res.success) {
				        wnd.closeWindow();
				    }
			    }
			);
		}
	});    
};

function encryptArgs(args, timestamp, cipher) {
    return {
        t: timestamp,
        oldpassword: args.oldpassword,
        newpassword: args.password
//        oldpassword: AESEncryptCtr(args.oldpassword, cipher, 256),
//        newpassword: AESEncryptCtr(args.password, cipher, 256)
    };
};



// source: ../www.onverse.com/Website/web/js/onverse/widgets/videoWidgets.js


//-------------------------------------------------------------------
// Youtube Utilities
//-------------------------------------------------------------------


// parses a video code from a youtube link
function parseYouTubeLink(url) {
    var regexList = [
	    'youtube.com\\/watch\\?v=(.*)',
	    'youtube.com\\/v\\/(.*)'
	];	
	var code = null;
	for (var i in regexList) {
	    var regex = new RegExp(regexList[i]);
        var m = regex.exec(url);
	    if (m != null && m.length >= 2) {
            code = m[1];
            break;
        }	            
	}		
	if (code != null) {	
	    var i = code.indexOf('&');
	    if (i > 0) code = code.substring(0, i);
	    var i = code.indexOf('"');
	    if (i > 0) code = code.substring(0, i);
    }    	
	return code;
}


// returns the thumbnail image for a given video code
function getYoutubeThumbnail(url) {
	var code = parseYouTubeLink(url);
	return 'http://img.youtube.com/vi/' + code + '/0.jpg'
}


//-------------------------------------------------------------------
// My Videos widget
//-------------------------------------------------------------------

var MyVideosWidget = {};

MyVideosWidget.init = function(jq) {
	var albums = [];
	OnverseApp.AsyncData.myProfile(function(res) {
	   if (res && res.success) {
			MyVideosWidget._init(jq, res.value);
		}
	});	
};

MyVideosWidget._init = function(jq, userProfile) {
	
	MyVideosWidget.ProfileVideo = null;
	MyVideosWidget.albumCount = 0;     

		
		var column = 0;
		var sb = new StringBuilder();
		sb.append('<table align="center"><tr>');
		
		for (var vi in userProfile.videoAlbums) {
			var album = userProfile.videoAlbums[vi];
			MyVideosWidget.albumCount++;

			var isFirst = 1;
			for (var i in album.videos) {
			   var video = album.videos[i];
			   if (i == userProfile.profile.videoid) {
			       MyVideosWidget.ProfileVideo = video;
			   }
			   var videourl = video.url;
			   var tnurl = getYoutubeThumbnail(videourl);
			   if (isFirst) {
			       sb.appendFormat('<td id="{0}" class="album" valign="top">', album.id);
			       sb.appendFormat('   <a href="{0}" class="lightbox" rel="valbum_{2}" title="{1}">', videourl, video.name, album.id);
			       sb.appendFormat('       <img src="{0}" /><span id="album-name">{1}</span>', tnurl, album.name);
			       sb.appendFormat('   </a>');
			       sb.appendFormat('</td>');
			       isFirst = 0;
			   }
			   else {
			       sb.appendFormat('<a href="{0}" class="lightbox" rel="valbum_{2}" title="{1}"></a>', videourl, video.name, album.id);
			   }
			}
			if (isFirst == 1) { //i.e there were no videos
			   sb.appendFormat('<td id="{0}" class="album" valign="top">', album.id);
			   sb.appendFormat('   <a href="{0}" class="lightbox" rel="valbum_{2}" title="{1}">', '/web/css/gfx/video_icon.jpg', 'Empty Album', album.id);
			   sb.appendFormat('       <img src="{0}" /><span id="album-name">{1}</span>', '/web/css/gfx/video_icon.jpg', album.name);
			   sb.appendFormat('   </a>');
			   sb.appendFormat('</td>');
			}
			// start new row after 2 albums
			column++;
			if (column > 2) {
			   column = 0;
			   sb.append('</tr><tr>');
			}
		}			

		// close out table
		sb.append('</tr></table>');
		jq.append(sb.build());
		jq.append('<div class="clear"></div>');

		// added photo to top
		if (MyVideosWidget.ProfileVideo) {
			var tnurl = getYoutubeThumbnail(MyVideosWidget.ProfileVideo.url);
			if (tnurl != null) {
			    var sb = new StringBuilder();
			    sb.appendFormat('<img class="profile-image" src="{0}" />', tnurl)
			    jq.prepend(sb.build());
			}
		}
		else if (MyVideosWidget.albumCount == 0) {
			jq.append('<span>You have no shared videos.</span>');
		}
		
		MyVideosWidget.buildGallery(jq);
};


MyVideosWidget.buildGallery = function(jq) {
    // builds lightbox-like gallery
    jq.find(' a.lightbox').each(function() {
        var $this = $(this);
        var albumdata = [];
        $("a[rel='" + $this.attr('rel') + "']").each(function() {
            albumdata.push({ img: this.href, title: $(this).attr('title') });
        });
        $this.bind('click', function() {
            var options = {};
            try { MyVideosWidget.show($this.find('#album-name').text(), albumdata, options); }
            catch (ex) { dump(ex); }
            return false;
        });
    });
}


// displays the video
MyVideosWidget.showVideo = function(jq, id, url) {

    var video =
        '<object id="onversemovie" width="100%" height="250">' +
        '<param name="movie" value="' + url + '"></param>' +
        '<param name="wmode" value="transparent"></param>' +
        '<embed id="onversemovie" src="' + url + '" ' +
        'type="application/x-shockwave-flash" ' +
        'wmode="transparent" width="100%" height="250">' +
        '</embed>' +
        '</object>';

    var sb = new StringBuilder();
    //sb.appendFormat('<a href="{0}" target="youtube">', url);
    //sb.appendFormat('<img src="{0}" height="350" border="0" /></a>', getYoutubeThumbnail(url));
    sb.append(video);
    sb.appendFormat('<div><small><i>click image to watch video</i></small></div>');
    jq.html(sb.build());
};

//
// Displays a video gallery in a popup window
//
// Arguments:
//  title       - text to display for window title
//  albumdata   - gallery to display
//  options     - (optional) overrides option data directly
//
MyVideosWidget.show = function(title, albumdata, options) {
    // process arguments
    var o = {
        container: 'wnd_' + String(Math.random()).substring(3),
        style: 'top:100px;left:0px;display:none;',
        title: 'Window',
        width: '850',
        icon: 'browser.png',
        skin: 'black',
        align: 'center'
    };
    if (options) {
        for (var i in options) {
            o[i] = options[i];
        }
    }

    // create window contents
    var html = '';
    html +=
        '<table width="100%" class="album-pager">' +
        '<td align="left" width="25%"><a href="javascript:nil()" id="album-prev">&lt; Previous</a></td>' +
        '<td align="center" width="50%" id="album-page">loading...</td>' +
        '<td align="right" width="25%"><a href="javascript:nil()" id="album-next">Next &gt;</a></td>' +
        '</table>';

    html += '<div id="album-custom"></div>'
    html += '<p id="album-caption"></p>';

    // create window
    var sb = new StringBuilder();
    sb.appendFormat('<div id="{0}" class="containerPlus draggable" width="{1}" style="{2}" buttons="m,c" icon="{3}" skin="{4}" minimized="false">', o.container, o.width, o.style, o.icon, o.skin);
    sb.appendFormat('   <div class="no"><div class="ne"><div class="n">&nbsp;&nbsp;{0}</div></div>', title);
    sb.appendFormat('       <div class="o"><div class="e"><div class="c"><div class="content" align="center">{0}</div></div></div></div>', html);
    sb.appendFormat('		<div><div class="so"><div class="se"><div class="s"></div></div></div></div>');
    sb.appendFormat('   </div>');
    sb.appendFormat('</div>');
    $('#windowContainer').append(sb.build());

    // display window and load contents
    var $wnd = $('#' + o.container);
    if (o.align == 'center') {
        $wnd.buildContainers({ containment: "document", elementsPath: "/web/css/elements/" })
           .css('height', '650px').centerInClient()
           .fadeIn()
		   ;
    }
    else {
        $wnd.buildContainers({ containment: "document", elementsPath: "/web/css/elements/" })
           .css('height', '650px')
           .fadeIn()
		   ;
    }

    // image events
    var lastimage = 0;
    function showImageNumber(i) {
        if (i >= albumdata.length) i = 0;
        else if (i < 0) i = albumdata.length - 1;
        lastimage = i;
        $wnd.find('#album-page').text('Video ' + (i + 1) + ' of ' + albumdata.length);
        $wnd.find('#album-caption').text(albumdata[i].title);
        MyVideosWidget.showVideo($wnd.find('#album-custom'), 'video' + i, albumdata[i].img);
    }
    showImageNumber(0);
    $('#' + o.container).find('#album-next').click(function() { showImageNumber(lastimage + 1); });
    $('#' + o.container).find('#album-prev').click(function() { showImageNumber(lastimage - 1); });
};







/**** NEW VIDEO MANAGER ****/

MyVideosWidget.manager = function() {
    var args = { title: 'Manage Videos', width: '750' };
    app.openWindow('/web/html/window/videoManager.htm', args, function() {
        VideoManager.build();
    });
};


var VideoManager = {};

//
// Launches the photo album view in full size.
//
VideoManager.viewAlbum = function(ref) {
    var jq = $(ref).parents('.album-title');
    var albumid = jq.find('#albumID').val();

    OnverseApp.AsyncData.myProfile(function(res) {
        var album = res.value.videoAlbums[albumid];
        var list = [];
        for (var id in album.videos) {
            var p = album.videos[id];
            list.push({ img: p.url, title: p.name });
        }
        if (list.length > 0) {
            MyVideosWidget.show('Full Size View: ' + album.name, list);
        }
        else {
            alert('Album is empty.');
        }
    });
}


//-------------------------------------------------------------------
// Album Editing
//-------------------------------------------------------------------

VideoManager.newAlbum = function(ref) {
    var jq = $('#videoEditMask');
    jq.find('#contents').html($('#video-add-album-template').html());
    jq.show();
}

VideoManager.cancelNewAlbum = function(ref) {
    var jq = $(ref).parents('.editmask');
    jq.hide();
}

VideoManager.saveNewAlbum = function(ref) {
    var jq = $(ref).parents('.editmask');
    var args = { name: jq.find('#albumName').val() };
    ajax('Creating new video album', 'profile', 'EditVideoAlbum', args,
        function(res) {
            jq.hide();
            VideoManager.reset();
        }
    );
}

VideoManager.showEditAlbum = function(ref) {
    var jq = $(ref).parents('.album-title');
    jq.addClass('selected');
    jq.find('#name').val(jq.find('label').text());
}

VideoManager.saveEditAlbum = function(ref) {
    var jq = $(ref).parents('.album-title');
    var args = {
        id: jq.find('#albumID').val(),
        name: jq.find('#name').val()
    };
    ajax('Saving video album changes', 'profile', 'EditVideoAlbum', args, function(res) {
        VideoManager.reset();
    });
    jq.removeClass('selected');
    jq.find('label').text(jq.find('#name').val());
}

VideoManager.cancelEditAlbum = function(ref) {
    var jq = $(ref).parents('.album-title');
    jq.removeClass('selected');
}

VideoManager.deleteAlbum = function(ref) {
    var jq = $(ref).parents('.album-title');
    if (confirm('Are you sure you want to delete this album and all videos within?')) {
        var args = { id: jq.find('#albumID').val() };
        ajax('Deleting video', 'profile', 'DeleteVideoAlbum', args, function(res) {
            VideoManager.reset();
        });
        jq.fadeOut('slow');
    }
}

//-------------------------------------------------------------------
// Video Editing
//-------------------------------------------------------------------

VideoManager.addVideo = function(ref) {
    var jq = $(ref).parents('.album-title');
    var album = jq.find('#albumID').val();

    var jq = $('#videoEditMask');
    jq.find('#contents').html($('#video-add-item-template').html());
    jq.find('#albumid').val(album);
    jq.show();
}


VideoManager.saveNewVideo = function(ref) {
    var jq = $(ref).parents('.editmask');
    var url = jq.find('#url').val();
    var name = jq.find('#name').val();
    var album = jq.find('#albumid').val();
    
    var code = parseYouTubeLink(url);
    if (code == null) {
        reportError('Video does not contain a valid YouTube(tm) link.');
        return;
    }

    var url = 'http://www.youtube.com/v/' + code;
    var args = { albumid: album, name: name, caption: '', videourl: url }
    ajax('Adding new video', 'profile', 'PostVideo', args,
        function(res) {
            jq.hide();
            VideoManager.reset();
        }
    );
}


VideoManager.showEditVideo = function(ref) {
    var jq = $(ref).parents('.item');
    jq.addClass('selected');
    jq.find('#name').val(jq.find('label').text());
    jq.find('#videourl').val(jq.find('#url').text());
}

VideoManager.saveEditVideo = function(ref) {
    var jq = $(ref).parents('.item');
    var args = {
        id: 	jq.find('#videoID').val(),
        name: 	jq.find('#name').val()
    };
    ajax('Saving video changes', 'profile', 'PostVideo', args, function(res) {
		VideoManager.reset();
    });
    jq.removeClass('selected');
    jq.find('label').text(jq.find('#text').val());
}

VideoManager.cancelEditVideo = function(ref) {
    var jq = $(ref).parents('.item');
    jq.removeClass('selected');
}

VideoManager.deleteVideo = function(ref) {
    var jq = $(ref).parents('.item');
    if (confirm('Are you sure you want to delete this video?')) {
        var args = { id: jq.find('#videoID').val() };
        ajax('Deleting photo', 'profile', 'DeleteVideo', args, function(res) {
			VideoManager.reset();
        });
        jq.fadeOut('slow');
    }
    else {
    }
}

VideoManager.setProfileVideo = function(ref) {
    var jq = $(ref).parents('.item');
    var id = jq.find('#videoID').val();
    
    OnverseApp.AsyncData.myProfile(function(res) {
	   var avatar = res.value.userProfile.profile.Avatar;
		ajax('Saving profile image', 'profile', 'Edit', { u: avatar, video: id },
      	function(res) {
         	//app.userProfile.profile.videoid = id;
         	VideoManager.reset();
      	}
    	);
	});
}

//-------------------------------------------------------------------
// Preview Size
//-------------------------------------------------------------------

VideoManager.setVideoSize = function(size) {
    VideoManager.lastsize = size;
    $('.photo-manager .item').css({ width: size });
    $('.photo-manager .item img.image').css({ width: size });
    if (size < 100) {
        $('.photo-manager tr.viewrow').css({ display: 'none' });
    }
    else {
        $('.photo-manager tr.viewrow').css({ display: '' });
    }
}

VideoManager.initVideoSize = function() {
    if (!VideoManager.lastsize)
        VideoManager.lastsize = 100;
    $("#slider").slider({
        min: 25, max: 150, value: VideoManager.lastsize,
        slide: function(event, ui) {
            VideoManager.setVideoSize(ui.value);
        }
    });
    VideoManager.setVideoSize(VideoManager.lastsize);
}


//-------------------------------------------------------------------
// Data binding
//-------------------------------------------------------------------

// clears the video list cache and rebuilds the view
VideoManager.reset = function() {
    OnverseApp.AsyncData.resetAll();
    VideoManager.build();    
}

VideoManager.build = function() {
    OnverseApp.AsyncData.myProfile(function(res) {
	    var userProfile = res.value;
        var albumList = res.value.videoAlbums;
        var albumTpl = $('#video-album-template').html()
            .replace(/\%7B/g, '{')
            .replace(/\%7D/g, '}')
            ;
        var photoTpl = $('#video-item-template').html()
            .replace(/\%7B/g, '{')
            .replace(/\%7D/g, '}')
            ;
        var sb = new StringBuilder();

        for (var albumID in albumList) {
            if (!VideoManager.albumid) {
                VideoManager.albumid = albumID;
            }
            var album = albumList[albumID];
            var albumStatus = '';
            var albumClass = '';
            sb.appendFormat(albumTpl, album.id, album.name, albumStatus, albumClass);
            sb.appendFormat('<div class="album-drop" style="min-height: 100px; width: 99%;">');
            sb.appendFormat('<input type="hidden" id="albumID" value="{0}" />', album.id);
            var hasphoto = false;
            for (var pindex in album.videos) {
                var video = album.videos[pindex];
                var caption = video.name;
                if (video.id == userProfile.profile.videoid) {
                    caption += '<br/><b>profile video</b>';
                }
                sb.appendFormat(photoTpl, 'src="'+ getYoutubeThumbnail(video.url) + '"', video.id, caption);
                hasphoto = true;
            }
            if (!hasphoto) {
                sb.appendFormat('<p style="color: black;">This album is empty</p>');
            }
            sb.appendFormat('</div>');
        }
        $('.photo-manager').html(sb.build());

        VideoManager.initVideoSize();
        VideoManager.initDragDrop();
    });
}

//-------------------------------------------------------------------
// Drag-drop
//-------------------------------------------------------------------

VideoManager.initDragDrop = function() {
    // drag / drop
    $(".item").draggable({ helper: 'clone' });
    $(".album-title, .album-drop").droppable({
        accept: '.item',
        hoverClass: 'dropHover',
        drop: function(ev, ui) {
            var video = $(ui.draggable).find('#videoID').val();
            var album = $(this).find('#albumID').val();
            ajax('Saving album change', 'profile', 'PostVideo', { id: video, albumid: album },
                function(res) {
                    VideoManager.reset();
                }
            );
        }
    });
};

