﻿// XANGA NETWORK MANAGER
// Copyright 2006 - Xanga.com, Inc. - All Rights Reserved

// WINDOW ONLOAD STUFF
window.onload=function() {
	if (navigator.userAgent.indexOf("Safari") > 0) { 
	    // add label click support to safari
		var labels = document.getElementsByTagName("label");
        if (labels != null && labels.length > 0)
		    for (i = 0; i < labels.length; i++)
		        labels[i].addEventListener("click", addLabelFocus, false);
	}
}

// ADD LABEL CLICK SUPPORT TO SAFARI
// from http://www.chriscassell.net/log/2004/12/19/add_label_click.html
// works just for checkboxes right now
// requires 'for' attribute with accompanying id on the checkbox
function addLabelFocus(){
	var item = document.getElementById(this.getAttribute("for"));
	item.focus();
	if (item.getAttribute("type") == "checkbox")
	    item["checked"] = !item["checked"];
}

function isEmpty(str) {
	if (str == null || str == "") return true;
	return (str.match(/^\s+$/));
}

// Page level variables
Type.registerNamespace("Xanga.Socnet.Page");
Xanga.Socnet.Page.PublicFriends = new function() {
    var _username = null;
    var _profileurl = null;
    var _connects = new Array();
    
    this.getConnects = function() { return (_connects == null) ? new Array() : _connects; }

    // Used to sort, gets list from filter
    var _sorter =
        new Xanga.Socnet.Webui.Client.Sorter(
            this.getConnects.bind(this));

    // Used to do paging, gets list from sorter
    var _pager =
        new Xanga.Socnet.Webui.Client.Pager(
            12, // Number per page
            _sorter.getSortedList);

    var _currentPage = -1; // Currently selected page
    var _activeConnViews;  // Stores currently active conn views
    var _sortDD = null;    // Sort drop-down

    // Event handlers, bound during init
    var _firstClick;
    var _prevClick;
    var _nextClick;
    var _lastClick;

    // Constructor
    this.init = function(username, profileUrl) {
        _username = username;
        _profileurl = profileUrl;

        // bind event listeners
        _firstClick = this.moveFirst.bind(this);
        _prevClick  = this.movePrevious.bind(this);
        _nextClick  = this.moveNext.bind(this);
        _lastClick  = this.moveLast.bind(this);

        Xanga.Socnet.Webui.Services.Connects.GetPublic(
            _username,
            this.initContinue.bind(this),
            this.initToutCbk.bind(this),
            this.initErrCbk.bind(this));
    }
    this.GetProfileUrl = function() { return _profileurl; }
    this.initToutCbk = function() {
        Xanga.Socnet.Page.Part.ManagerMessages.showErrorMessage("Timeout - TODO: handle this gracefully... - Joel", 10)
    }
    this.initErrCbk = function(exception) {
        Xanga.Socnet.Page.Part.ManagerMessages.showErrorMessage(exception.get_message(), 10);
    }

    // Constructor con't, gets called after Controller has loaded data
    this.initContinue = function(connects) {
        Element.hide('loading');
        
        for (var i = 0; i < connects.length; i++)
            _connects.push(new Xanga.Socnet.Webui.Client.Objects.PublicConnection(connects[i]));

	    this.createSortDropdown();

        Event.observe('pagenavlast1', 'click', _lastClick, false);
        Event.observe('pagenavlast2', 'click', _lastClick, false);
        Event.observe('pagenavnext1', 'click', _nextClick, false);
        Event.observe('pagenavnext2', 'click', _nextClick, false);

	    // Set defaults
	    _sorter.setCriteria('update');
	    _sorter.update();
	    _pager.update();
	    this.jumpToPage(1);

	    // Draw the first page of connections
	    this.render();
    }

    // Creates the sort dropdown widget
    this.createSortDropdown = function() {
        if (_sortDD != null) _sortDD.dispose();

        // Options
	    var ddOpts = {fname:$("firstName_lower").value, uname:$("username_lower").value, location:$("location_lower").value, update:$("lastUpdated_lower").value};

	    // Create the sort dropdown
	    _sortDD = new XangaDropdown(
	        'sortbyOther',
	        $('sortBy_lower').value,
	        ddOpts,
	        'update',
	        Function.createDelegate(this, this.sortBy));
    }

    // Changes the sorting criteria used
    this.sortBy = function(criteria) {
        _sorter.setCriteria(criteria);
        _sorter.update();
        _pager.update();
        this.render();
    }

    // Updates the nav buttons
    this.jumpToPage = function(page) {
        if (page > _pager.getPageCount() ||
            page < 1)
            return;
        
        _currentPage = page;
        
        if (_currentPage == 1) {
            Element.hide('pagenavfirst1', 'pagenavfirst2', 'pagenavprev1', 'pagenavprev2');
            Event.stopObserving('pagenavfirst1', 'click', _firstClick);
            Event.stopObserving('pagenavfirst2', 'click', _firstClick);
            Event.stopObserving('pagenavprev1', 'click',  _prevClick);
            Event.stopObserving('pagenavprev2', 'click',  _prevClick);
        }
        else if (!Element.visible('pagenavfirst1')) {
            Element.show('pagenavfirst1', 'pagenavfirst2', 'pagenavprev1', 'pagenavprev2');
            Event.observe('pagenavfirst1', 'click', _firstClick, false);
            Event.observe('pagenavfirst2', 'click', _firstClick, false);
            Event.observe('pagenavprev1', 'click',  _prevClick,  false);
            Event.observe('pagenavprev2', 'click',  _prevClick,  false);
        }
        
        if (_currentPage == _pager.getPageCount() && !Element.hasClassName('pagenavlast1', 'pagenavlastoff')) {
            Element.addClassName('pagenavlast1', 'pagenavlastoff');
            Element.addClassName('pagenavlast2', 'pagenavlastoff');
            Element.addClassName('pagenavnext1', 'pagenavnextoff');
            Element.addClassName('pagenavnext2', 'pagenavnextoff');
            
            Event.stopObserving('pagenavlast1', 'click', _lastClick);
            Event.stopObserving('pagenavlast2', 'click', _lastClick);
            Event.stopObserving('pagenavnext1', 'click', _nextClick);
            Event.stopObserving('pagenavnext2', 'click', _nextClick);
        }
        else if (_currentPage != _pager.getPageCount() && Element.hasClassName('pagenavlast1', 'pagenavlastoff')) {
            Element.removeClassName('pagenavlast1', 'pagenavlastoff');
            Element.removeClassName('pagenavlast2', 'pagenavlastoff');
            Element.removeClassName('pagenavnext1', 'pagenavnextoff');
            Element.removeClassName('pagenavnext2', 'pagenavnextoff');
            
            Event.observe('pagenavlast1', 'click', _lastClick, false);
            Event.observe('pagenavlast2', 'click', _lastClick, false);
            Event.observe('pagenavnext1', 'click', _nextClick, false);
            Event.observe('pagenavnext2', 'click', _nextClick, false);
        }
    }
    
    // Moves to first page
    this.moveFirst = function() {
        this.jumpToPage(1);
        this.render();
    }
    // Moves to prev page
    this.movePrevious = function() {
        this.jumpToPage(_currentPage - 1);
        this.render();
    }
    // Moves to next page
    this.moveNext = function() {
        this.jumpToPage(_currentPage + 1);
        this.render();
    }
    // Moves to last page
    this.moveLast = function() {
        this.jumpToPage(_pager.getPageCount());
        this.render();
    }

    // Renders the updated page and adds it to the DOM
    this.render = function() {
        // Remove old views if they exist
        if (_activeConnViews != null)
            for (var i = 0; i < _activeConnViews.length; i++)
                _activeConnViews[i].unrender();

        _activeConnViews = new Array();

        // Get new conns to render and display them
        var conns = _pager.getPageList(_currentPage);
        if (conns == null || conns.length == 0) {
            // No reqs to show, hide some stuff
            Element.hide('friends', 'browseopts', 'pagenavbottom');
            Element.show('emptymessage');
        }
        else {
            // Make sure the right things are showing
            Element.show('friends', 'browseopts', 'pagenavkey', 'pagenavbottom');
            Element.hide('emptymessage');

            for (var c = 0; c < conns.length; c++) {
                var defaultView = new Xanga.Socnet.Webui.Client.Objects.Views.PublicFriends.Connection.Default(conns[c]);
                defaultView.render();
                _activeConnViews.push(defaultView);
            }
        }
    }
}

///////////////////////////////////////////////////////////////////////////////
// CONNECTION VIEWS                                                          //
///////////////////////////////////////////////////////////////////////////////
Type.registerNamespace("Xanga.Socnet.Webui.Client.Objects.Views.PublicFriends.Connection");

// The view class for a connection object
Xanga.Socnet.Webui.Client.Objects.Views.PublicFriends.Connection.Default = function(conn) {
    var _conn = conn;

    this.getConnection = function() { return _conn; }
    this.getElementID  = function() { return "conn_default_" + _conn.getUsername(); }

    // Creates the HTML and inserts it into the DOM
    this.render = function() {
        var el = Builder.node('li', {id:this.getElementID()}, [
            Builder.node('dl', null, [
                Builder.node('dt', null, [ "Image" ]),
                Builder.node('dd', {className:"profimage"}, [
                    Builder.node('img', {src:_conn.getImageURL(), alt:_conn.getFirstName() }, null)
                ]),

                Builder.node('dt', null, [ "Name" ]),
                Builder.node('dd', {className:"profname"}, [
                    Builder.node('strong', {}, [ _conn.getFirstName() ]),
                    "(" + _conn.getUsernameDisplay() + ")"
                ]),

                Builder.node('dt', null, [ "Location" ]),
                Builder.node('dd', {className:"proflocation"}, [
                    _conn.getMetroName()
                ]),

                Builder.node('dt', null, [ "Updated" ]),
                Builder.node('dd', {className:"date"}, [ "" + _conn.getLastUpdate() ]),

                Builder.node('dt', null, [ "Profile" ]),
                Builder.node('dd', {className:"more"}, [
                    Builder.node('a', {
                            className:"visit",
                            href:_conn.getSiteUrl(),
                            title:$("visit").value + " "+_conn.getFirstName()+"!",
                            onfocus:"this.parentNode.parentNode.className='choose';",
                            onblur:"this.parentNode.parentNode.className='';",
                            onmouseover:"this.parentNode.parentNode.className='choose';",
                            onmouseout:"this.parentNode.parentNode.className='';"
                        },
                        [ "visit" ]
                    )
                ])
            ])
        ]);
    
        el.view = this;

        $('friends').appendChild(el);

	    return el;
    }
    
    this.unrender = function() {
        this.dispose();
    }
    
    this.showEdit = function(evt) {
        var editView = new Xanga.Socnet.Webui.Client.Objects.Views.ConnectionManager.Edit.Default(_conn);
        editView.render(evt);
    }
    
    this.dispose = function() {
        // Remove from the DOM
        Element.remove(this.getElementID());
        
        // Null out variables
        _conn = null;
    }
}
Xanga.Socnet.Webui.Client.Objects.Views.PublicFriends.Connection.Default.registerClass(
    "Xanga.Socnet.Webui.Client.Objects.Views.PublicFriends.Connection.Default",
    null,
    Sys.IDisposable);