﻿function init() {
    ImagePrimer.preLoadImages();
    stateMap = new StateMap();
    var req = opensocial.newDataRequest();
    var params = {};
    params[opensocial.DataRequest.PeopleRequestFields.PROFILE_DETAILS] = [MyOpenSpace.Person.Field.REGION];
    req.add(req.newFetchPersonRequest(opensocial.DataRequest.PersonId.VIEWER, params));
    req.add(req.newFetchPersonAppDataRequest(opensocial.DataRequest.PersonId.OWNER, ['dpId', 'animal_breed', 'age', 'state_org']), 'ownerdata');
    friendManager.addReq(req);
    req.send(fillContent);
    gadgets.io.makeRequest('http://services.dogpile.com/fetcher/content.ashx?brand=mysp.pf.dogpile&area=canvas&shape=plug', fillFooter);
}
function fillContent(data) {
    fillUserData(data.get('ownerdata'), data.get(opensocial.DataRequest.PersonId.VIEWER));
    if (invalidUser) return;
    fillPrefInfo();
    var pDataString = gadgets.views.getParams()['pfData'];
    PFFetcher.pfData = gadgets.json.parse(pDataString);
    if (PFFetcher.pfData) {
        PFFetcher.fillData();
    }
    else {
        PFFetcher.fetch();
    }
    fillFriendInfo(data);
}
function fillFooter(response) {
    if (!response || !response.data) return;
    document.getElementById('footer').innerHTML = response.data;
}
function fillUserData(userAppData, viewerData) {
    var tempState = '';
    var tempId = '';
    var isOwner = false;
    if (!viewerData.hadError()) {
        var viewer = viewerData.getData();
        tempState = stateMap.getStateCode(viewer.getField(MyOpenSpace.Person.Field.REGION));
        tempId = viewer.getId();
        isOwner = viewer.isOwner();
    }
    else if (viewerData.getErrorCode() == 'unauthorized') {
        document.getElementById('contentArea').innerHTML = '<p id="invalidUser">You must first add this application before browsing adoptable pets.</p>';
        invalidUser = true;
        return;
    }
    if (userAppData.hadError() || !isOwner) {
        userData = new UserData('', '', '', '', tempState, '');
    }
    else {
        var userFields = userAppData.getData()[viewer.getId()];
        userData = new UserData(userFields['dpId'], userFields['animal_breed'], userFields['age'], userFields['state_org'] ? userFields['state_org'] : tempState);
        checkId();
    }
}
function checkId() {
    if (!userData.dpId) {
        var params = {};
        params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.DOM;                    
        var url = 'http://services.dogpile.com/guid/service.asmx/CreateGUID';
        gadgets.io.makeRequest(url, fillOwnerId, params); 
    }
}
function fillOwnerId(response) {
    if (!response || !response.data) return;
    var guid = response.data.getElementsByTagName('string')[0].firstChild.nodeValue;
    var req = opensocial.newDataRequest();
    req.add(req.newUpdatePersonAppDataRequest(opensocial.DataRequest.PersonId.VIEWER, 'dpId', guid));
    req.send();
    userData.dpId = guid;
}
function fillFriendInfo(data) {
    friendManager.fillInfo(data);
}
function selectFriend() {
    var selRegEx = new RegExp(FriendManager.Layout.SEL_FRIEND, 'g');
    if (this.className.indexOf(FriendManager.Layout.SEL_FRIEND) > -1) {
        this.className = this.className.replace(selRegEx, '');
        friendManager.sRemove(this.getElementsByTagName('img')[0].alt);
    }
    else {
        this.className += FriendManager.Layout.SEL_FRIEND;
        friendManager.sAdd(this.getElementsByTagName('img')[0].alt);
    }
    document.getElementById('selectedCount').innerHTML = friendManager.sCount();
}
function sendAppRequest(friend) {
    if (!friend || !friend.getId) return;
    var message = opensocial.newMessage('[sender] would like you to install [app] and begin browsing Petfinder\'s library of adoptable pets!');
    opensocial.requestShareApp(friend.getId(), message, continueSendAppRequest);
}
function continueSendAppRequest(response) {
    switch (response) {
        case MyOpenSpace.PostTo.Result.ERROR:
            friendManager.sReset();
            return;
        case MyOpenSpace.PostTo.Result.CANCELLED:
        case MyOpenSpace.PostTo.Result.SUCCESS:
        default:
            sendAppRequest(friendManager.sNext());
            break;
    }
}
function sharePet(friend) {
    if (friend && PFFetcher.pfData && PFFetcher.pfData.id) {
        var container = opensocial.Container.get();
        var token = MyOpenSpace.MySpaceContainer.OSToken;
        var messageString = 'I thought you would be interested in this pet:<br /><br />';
        messageString += 'Hi, I\'m <a href="' + PFFetcher.pfData.u + '" target="_blank">' + PFFetcher.pfData.n + '</a><br />';
        messageString += 'I\'m a ' + PFFetcher.pfData.b + '<br />';
        messageString += 'from <a href="' + PFFetcher.pfData.sh.u +'" target="_blank">' + PFFetcher.pfData.sh.n + '</a><br />'
        messageString += PFFetcher.pfData.c + ', ' + PFFetcher.pfData.s2 + '<br />';
        messageString += '<img src="' + PFFetcher.pfData.i.fpm + '" /><br /><br />';
        messageString += 'To browse additional adoptable pets add <a href="http://www.myspace.com/index.cfm?fuseaction=user.viewprofile&friendid=413016102" target="_blank">Dogpile Adoptable Pets</a> to your profile.';
        var message = opensocial.newMessage(messageString);
        message.setField(opensocial.Message.Field.TITLE, 'Dogpile Adoptable Pet');
        message.setField(opensocial.Message.Field.TYPE, MyOpenSpace.PostTo.Targets.SEND_MESSAGE);
        container.postTo(token, message, friend, continueSharePet);
    }
}
function continueSharePet(response) {
    switch (response) {
        case MyOpenSpace.PostTo.Result.ERROR:
            friendManager.sReset();
            return;
        case MyOpenSpace.PostTo.Result.CANCELLED:
        case MyOpenSpace.PostTo.Result.SUCCESS:
        default:
            sharePet(friendManager.sNext());
            break;
    }
}
function fillPrefInfo() {
    setSelected('animalSelection', userData.animal, refreshBreedList, true);
    setSelected('ageSelection', userData.age);
    setSelected('stateSelection', userData.state, refreshOrgList, true);
}
function setSelected(selectList, value, refreshCallback, init) {
    if (value) {
        var options = typeof(selectList) === 'string' ? document.getElementById(selectList).options : selectList.options;
        for (var i=0; i < options.length; i++) {
            if (options[i].value == value) {
                options[i].selected = true;
                if (refreshCallback) refreshCallback(init);
                break;
            }
        }
    }
}
function refreshBreedList(init) {
    ImagePrimer.setButtonState('savePrefs', 'spref', false);
    document.getElementById('breedRefresh').style.visibility = 'visible';
    var animal = getDropDownValue('animalSelection');
    var breed = init ? userData.breed : getDropDownValue('breedSelection');
    var url = 'http://www.petfinder.com/fpm/widgets/facebook/fp/breedlist.cgi?animal=' + animal + '&breed=' + breed;
    var params = {};
    params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
    gadgets.io.makeRequest(url, fillBreedList, params);
}
function fillBreedList(response) {
    ImagePrimer.setButtonState('savePrefs', 'spref', true);
    document.getElementById('breedRefresh').style.visibility = 'hidden';
    var breedSelection = document.getElementById('breedSelection');
    breedSelection.options.length = 0;
    if (!response || !response.data) {
        var option = document.createElement('option');
        option.innerHTML = 'All';
        option.value = '';
        breedSelection.appendChild(option);
        return;
    }
    var breedList = response.data.ResultSet.list;
    var selectedBreed = response.data.ResultSet.s;
    for (var i=0; i < breedList.length; i++) {
        var option = document.createElement('option');
        option.innerHTML = breedList[i];
        option.value = i == 0 ? '' : breedList[i];
        if (selectedBreed && option.value == selectedBreed) option.selected = true;
        breedSelection.appendChild(option);
    }
}
function refreshOrgList(init) {
    ImagePrimer.setButtonState('savePrefs', 'spref', false);
    document.getElementById('orgRefresh').style.visibility = 'visible';
    var state = getDropDownValue('stateSelection');
    var org = init ? userData.org : getDropDownValue('orgSelection');
    var url = 'http://www.petfinder.com/fpm/widgets/facebook/fp/shelterList.php?state=' + state + '&shelter=' + org;
    var params = {};
    params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
    gadgets.io.makeRequest(url, fillOrgList, params);
}
function fillOrgList(response) {
    ImagePrimer.setButtonState('savePrefs', 'spref', true);
    document.getElementById('orgRefresh').style.visibility = 'hidden';
    var orgSelection = document.getElementById('orgSelection');
    orgSelection.options.length = 0;
    if (!response || !response.data) {
        var option = document.createElement('option');
        option.innerHTML = 'All';
        option.value = '';
        breedSelection.appendChild(option);
        return;
    }
    var orgList = "l" in response.data ? response.data.l : response.data;
    for (var i=0; i < orgList.length; i+=2) {
        var option = document.createElement('option');
        option.innerHTML = orgList[i];
        option.value = orgList[i+1];
        if (option.value == userData.org) option.selected = true;
        orgSelection.appendChild(option);
    }
}
function getDropDownValue(dropDownId) {
    var dropDown = typeof(dropDownId) === 'string' ? document.getElementById(dropDownId) : dropDownId;
    if (!dropDown) return '';
    return dropDown.selectedIndex > -1 ? dropDown.options[dropDown.selectedIndex].value : '';
}
function savePrefs() {
    ImagePrimer.setButtonState('savePrefs', 'spref', false);
    document.getElementById('prefsSaveSpin').style.visibility = 'visible';
    document.getElementById('prefsMessage').innerHTML = '';
    var req = opensocial.newDataRequest();
    var animalBreed = getDropDownValue('animalSelection') + '::' + getDropDownValue('breedSelection');
    var age = getDropDownValue('ageSelection');
    var stateOrg = getDropDownValue('stateSelection') + '::' + getDropDownValue('orgSelection');
    userData = new UserData(userData.dpId, animalBreed, age, stateOrg);
    req.add(req.newUpdatePersonAppDataRequest(opensocial.DataRequest.PersonId.VIEWER, 'animal_breed', animalBreed));
    req.add(req.newUpdatePersonAppDataRequest(opensocial.DataRequest.PersonId.VIEWER, 'age', age));
    req.add(req.newUpdatePersonAppDataRequest(opensocial.DataRequest.PersonId.VIEWER, 'state_org', stateOrg));
    req.send(prefsSaved);
}
function prefsSaved(response) {
    ImagePrimer.setButtonState('savePrefs', 'spref', true);
    document.getElementById('prefsSaveSpin').style.visibility = 'hidden';
    var message = document.getElementById('prefsMessage');
    if (!response || response.hadError()) {
        message.innerHTML = 'Error updating settings.  Please try again.';
    }
    else {
        message.innerHTML = 'Settings updated successfully!';
        window.setTimeout('(function() { document.getElementById(\'prefsMessage\').innerHTML = \'\'; })()', 3000);
        PFFetcher.fetch();
    }
}
function switchTab(targetTab) {
    if (typeof(targetTab) === 'string') targetTab = document.getElementById(targetTab);
    var activeClass = ' activeTab';
    if (targetTab.className.indexOf(activeClass) > -1 || invalidUser) return;
    var reg = new RegExp(activeClass, 'g');
    var tabs = document.getElementById('tabList').getElementsByTagName('img');
    for (var i=0; i < tabs.length; i++) {
        var tab = tabs[i];
        if (tab.id == targetTab.id) {
            tab.className += activeClass;
            ImagePrimer.setButtonState(tab, tab.id, true);
            document.getElementById(tab.id + 'Pane').style.display = 'block';
        }
        else {
            tab.className = tab.className.replace(reg, '');
            ImagePrimer.setButtonState(tab, tab.id, false);
            document.getElementById(tab.id + 'Pane').style.display = 'none';
        }
    }
}
function UserData(dpId, animalBreed, age, stateOrg) {
    this.dpId = dpId ? dpId : '';
    var animalAndBreed = animalBreed && animalBreed.split ? animalBreed.split('::') : ['', ''];
    this.animal = animalAndBreed[0];
    this.breed = animalAndBreed.length > 1 ? animalAndBreed[1] : '';
    this.age = age ? age : '';
    var stateAndOrg = stateOrg && stateOrg.split ? stateOrg.split('::') : ['', ''];
    this.state = stateAndOrg[0];
    this.org = stateAndOrg.length > 1 ? stateAndOrg[1] : '';
}
function StateMap() {
    var states = document.getElementById('stateSelection').options;
    for(var i=1; i < states.length; i++) {
        this[states[i].text.toLowerCase()] = states[i].value;
    }
}
StateMap.prototype.getStateCode = function(stateName) {
    if (typeof(stateName) === 'string') {
        stateName = stateName.toLowerCase();
        return this[stateName] || '';
    }
    return '';
};
function FriendManager() {
    var SelectedFriends = function() {
        this.i = -1;
        this.f = [];
    };
    SelectedFriends.prototype.add = function(friend) {
        if (!friend) return;
        this.f.push(friend);
    };
    SelectedFriends.prototype.remove = function(friend) {
        if (!friend) return;
        for (var i=0; i < this.f.length; i++) {
            if (this.f[i].getId() == friend.getId()) {
                this.f.splice(i, 1);
                return;
            }
        }
    };
    SelectedFriends.prototype.next = function() {
        if (++this.i > this.f.length - 1) { this.i = -1; return null; }
        return this.f[this.i];
    };
    SelectedFriends.prototype.reset = function() {
        this.i = -1;
    };
    var s = new SelectedFriends();
    var max = 21;
    var prevOffset = -2*max;
    var nextOffset = 0;
    var friends = null;
    var currDir = FriendManager.Direction.NEXT;
    function getOffset() {
        return currDir == FriendManager.Direction.PREV ? prevOffset : nextOffset;
    }
    function setFriends(friendList) {
        switch (currDir) {
            case FriendManager.Direction.PREV:
                if (prevOffset >= 0) { prevOffset -= max; nextOffset -= max; }
                break;
            case FriendManager.Direction.NEXT:
            default:
                if (nextOffset < friendList.getTotalSize()) { prevOffset += max; nextOffset += max; }
                break;
        }
        friends = friendList;
    }
    this.sAdd = function(friend) {
        if (typeof(friend) === 'string') friend = friends.getById(friend);
        if (friend) s.add(friend);
    };
    this.sRemove = function(friend) {
        if (typeof(friend) === 'string') friend = friends.getById(friend);
        if (friend) s.remove(friend);
    };
    this.sNext = function() {
        return s.next();
    };
    this.sReset = function() {
        s.reset();
    };
    this.sContains = function(friendId) {
        for (var i=0; i < s.f.length; i++) {
            if (friendId == s.f[i].getId()) return true;
        }
        return false;
    };
    this.sCount = function() {
        return s.f.length;
    };
    this.sClear = function() {
        var reg = new RegExp(FriendManager.Layout.SEL_FRIEND, 'g');
        var friendElements = document.getElementById('friendsContainer').childNodes;
        for (var i=0; i < friendElements.length; i++) {
            var element = friendElements[i];
            if (element.className.indexOf(FriendManager.Layout.SEL_FRIEND) > -1)
                element.className = element.className.replace(reg, '');
        }
        document.getElementById('selectedCount').innerHTML = 0;
        s = new SelectedFriends();
    };
    this.addReq = function(req) {
        if (!req) req = opensocial.newDataRequest();
        var params = {};
        params[opensocial.DataRequest.PeopleRequestFields.FIRST] = getOffset();
        params[opensocial.DataRequest.PeopleRequestFields.MAX] = max;
        req.add(req.newFetchPeopleRequest(opensocial.DataRequest.Group.VIEWER_FRIENDS, params));
        return req;
    };
    this.fillInfo = function(data) {
        var friendData = data.get(opensocial.DataRequest.Group.VIEWER_FRIENDS);
        var friendContainer = document.getElementById('friendsContainer');
        var appRequestButton = document.getElementById('appRequestButton');
        var sharePetButton = document.getElementById('sharePetButton');
        var prevButton = document.getElementById('prevFriendsButton');
        var nextButton = document.getElementById('nextFriendsButton');
        if (friendData.hadError()) {
            if (friendData.getErrorCode() == opensocial.ResponseItem.Error.UNAUTHORIZED) {
                friendContainer.innerHTML = '<span>Your settings do not allow Adoptable Pets to access your friends list.</span>';
            }
            else {
                friendContainer.innerHTML = '<span>Unable to retrieve friends list: ' + friendData.getErrorMessage() + '</span>';
            }
            return;
        }
        setFriends(friendData.getData());
        if (friends.getTotalSize() <= 0) {
            friendContainer.innerHTML = '<span>You have no friends :(</span>';
        }
        else {
            friendContainer.innerHTML = '';
            friends.each(function(friend) {
                var friendElement = document.createElement('div');
                friendElement.onclick = selectFriend;
                friendElement.className = 'friendElement clickable';
                if (friendManager.sContains(friend.getId())) friendElement.className += FriendManager.Layout.SEL_FRIEND;
                var name = document.createElement('span');
                name.className = 'friendName';
                name.innerHTML = friend.getDisplayName();
                friendElement.appendChild(name);
                var portrait = document.createElement('div');
                portrait.className = 'portrait';
                friendElement.appendChild(portrait);
                var image = new Image();
                image.src = friend.getField(opensocial.Person.Field.THUMBNAIL_URL);
                image.alt = friend.getId();
                portrait.appendChild(image);
                friendContainer.appendChild(friendElement);
            });
        }
    };
    this.getFriends = function(dir) {
        currDir = dir;
        switch (currDir) {
            case FriendManager.Direction.PREV:
                if (prevOffset < 0) return;
                break;
            case FriendManager.Direction.NEXT:
            default:
                if (friends && nextOffset >= friends.getTotalSize()) return;
                break;
        }
        var req = this.addReq();
        req.send(fillFriendInfo);
    };
}
FriendManager.Direction = {};
FriendManager.Direction.PREV = 0;
FriendManager.Direction.NEXT = 1;
FriendManager.Layout = {};
FriendManager.Layout.SEL_FRIEND = ' selectedFriend';
var PFFetcher = {
    pfUrl: 'http://www.petfinder.com/fpm/fp/petfeed.cgi?lang=json',
    petUrl: 'http://www.petfinder.com/petnote/displaypet.cgi?petid=',
    ier: 0,
    pfData: null,
    fetch: function() {
        ImagePrimer.setButtonState('refreshPet', 'npet', false);
        document.getElementById('petImagePane').style.display = 'none';
        document.getElementById('loadingPane').style.display = 'block';
        document.getElementById('fullDescription').innerHTML = '';
        document.getElementById('descLoading').style.visibility = 'visible';
        var url = PFFetcher.pfUrl + '&animal=' + userData.animal + '&breed=' + userData.breed + '&age=' + userData.age + '&state=' + userData.state + '&shelter=' + userData.org + '&ier=' + PFFetcher.ier++;
        var params = {};
        params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
        gadgets.io.makeRequest(url, PFFetcher.startFill, params);
    },
    clearData: function(desc) {
        var petImage = document.getElementById('petImage');
        petImage.src = 'http://gidgets.dogpile.com/petfinder/myspace/pics/canvasError.gif';
        petImage.alt = '';
        document.getElementById('petImageLink').href = 'javascript:void(0)';
        document.getElementById('petName').innerHTML = '';
        document.getElementById('breedDesc').innerHTML = '';
        document.getElementById('orgDesc').innerHTML = ''
        document.getElementById('locationDesc').innerHTML = '';
        document.getElementById('descLoading').style.visibility = 'hidden';
        document.getElementById('fullDescription').innerHTML = desc;
        var link = document.getElementById('petActivityLink');
        link.href = '#';
        link.innerHTML = '';
        ImagePrimer.setButtonState('refreshPet', 'npet', true);
    },
    startFill: function(response) {
        if (!response || !response.data) {
            PFFetcher.pfData = null;
            PFFetcher.clearData('An error occured when retrieving pet information.  Please try again.');
            return;
        }
        PFFetcher.pfData = response.data;
        PFFetcher.fillData();
    },
    fillData: function() {
        if (!PFFetcher.pfData.id) {
            PFFetcher.clearData('No pets were found under your selected criteria.  Try widening your search criteria.');
            ImagePrimer.setButtonState('refreshPet', 'npet', false);
            var link = document.getElementById('petActivityLink');
            link.href = 'javascript:(switchTab(\'pref\'))';
            link.innerHTML = 'Change your preferences';
            return;
        }
        gadgets.io.makeRequest(PFFetcher.petUrl + PFFetcher.pfData.id, PFFetcher.fillDescription);
        var petImage = document.getElementById('petImage');
        petImage.src = PFFetcher.pfData.i.notes;
        petImage.alt = PFFetcher.pfData.n;
        document.getElementById('petImageLink').href = PFFetcher.pfData.u;
        document.getElementById('petName').innerHTML = 'Hi, I\'m <a href="' + PFFetcher.pfData.u + '" target="_blank">' + PFFetcher.pfData.n + '</a>';
        document.getElementById('breedDesc').innerHTML = 'I\'m a ' + PFFetcher.pfData.b;
        document.getElementById('orgDesc').innerHTML = 'from <a href="' + PFFetcher.pfData.sh.u +'" target="_blank">' + PFFetcher.pfData.sh.n + '</a>'
        document.getElementById('locationDesc').innerHTML = PFFetcher.pfData.c + ', ' + PFFetcher.pfData.s2;
        var link = document.getElementById('petActivityLink');
        link.href = 'javascript:(switchTab(\'share\'))';
        link.innerHTML = 'Share this pet with a friend';
        ImagePrimer.setButtonState('refreshPet', 'npet', true);
    },
    finishFill: function(imgElement) {
        var loadingPane = document.getElementById('loadingPane');
        var loadingImage = document.getElementById('loadingImage');
        document.getElementById('petImagePane').style.display = 'block';
        loadingPane.style.display = 'none';
        loadingPane.style.height = imgElement.height + 'px';
        loadingImage.style.top = imgElement.height / 2 - 25 + 'px';
    },
    fillDescription: function(response) {
        document.getElementById('descLoading').style.visibility = 'hidden';
        if (!response || !response.data || !PFFetcher.pfData || !PFFetcher.pfData.id) return;
        var html = response.data;
        var stoken = '<noscript>';
        var etoken = '</noscript>';
        var start = html.indexOf(stoken);
        if (start <= -1) return;
        start += stoken.length;
        var end = html.indexOf(etoken, start);
        if (end <= -1) return;
        var endLine = '';
        var diff = end - start;
        if (diff > 1024) { end -= (diff - 1024); endLine = '...'; }
        var description = html.slice(start, end);
        description = description.replace(/<[^>]+>/g, '');
        document.getElementById('fullDescription').innerHTML = description + endLine;
    }
};
var ImagePrimer = {
    homea: 'homeActive.gif',
    homei: 'homeInactive.gif',
    sharea: 'shareActive.gif',
    sharei: 'shareInactive.gif',
    prefa: 'prefActive.gif',
    prefi: 'prefInactive.gif',
    npeta: 'canvasNextPetActive.gif',
    npeti: 'canvasNextPetInactive.gif',
    sprefa: 'savePrefActive.gif',
    sprefi: 'savePrefInactive.gif',
    getPicUrl: function(name) {
        return 'http://gidgets.dogpile.com/petfinder/myspace/pics/' + (name in ImagePrimer ? ImagePrimer[name] : 'spacer.gif');
    },
    preLoadImages: function() {
        var pics = ['homei', 'sharea', 'prefa', 'npeti', 'sprefi'];
        for (var i=0; i < pics.length; i++) {
            new Image().src = ImagePrimer.getPicUrl(pics[i]);
        }
    },
    setButtonState: function(element, name, active) {
        if (typeof(element) === 'string') element = document.getElementById(element);
        if (element.tagName == 'INPUT') element.disabled = !active;
        name = active ? name + 'a' : name + 'i';
        element.src = ImagePrimer.getPicUrl(name);
    }
};
var userData = null;
var stateMap = null; // set in init(); depends on markup
var friendManager = new FriendManager();
var invalidUser = false;
