/*
 * Copyright (c) 2006-2007 Collactive. All rights reserved.
 */
// YouTube Site Automation API
YouTube = function() {
	this._createAssistant = function() {
		return new Collactive.Assistant("youtube",
			["emailAddress", "country", "zipCode", "gender", "dateOfBirth"],
			this._storage, this._ui);
	};

    this.loginAndPerform = this._assistedFunction({
       	navigateFirst: false,
        clientOnly: true,
        accountRequired: true
    }, function(url, callback, actionFunc, username, password, email) {
		this._storage.clearSession();
		this._saAPI.login(this._asyncCallback(function (status) {
			if (status) {
				this._saAPI.navigateTo(url, this._asyncCallback(function (status) {
    				actionFunc();
					}));
			} else {
				callback(status);
			}
		}), username, password, email);
    });


    this.register = this._assistedFunction({
        navigateFirst: false,
        clientOnly: true,
        accountRequired: false
    }, function(callback) {
        this._saAPI.register(this._asyncCallback(function (status) { callback(status); }));
    });


    this.login = function(url, callback, username, password, email) {
	   this.loginAndPerform(url, callback, Collactive.bind(this, function() {
                						callback(true);
       }), username, password, email);
    };


	this.rate = function(url, stars, callback, username, password, email) {
	   this.loginAndPerform(url, callback, Collactive.bind(this, function() {
            this._saAPI.rate(stars, this._asyncCallback(function (status) {
                						callback(status);
                					}));
	   }), username, password, email);
	};

	this.saveToFavorites = function(url, callback, username, password, email) {
	   this.loginAndPerform(url, callback, Collactive.bind(this, function() {
            this._saAPI.saveToFavorites(this._asyncCallback2(function (status) {
                						callback(status);
                					}));
	   }), username, password, email);
	};

    this.discuss = function(url, commentText, callback, username, password, email) {
	   	this.loginAndPerform(url, callback, Collactive.bind(this, function() {
        	this._saAPI.discuss(commentText, this._asyncCallback2(function (status) {
            	callback(status);
			}));
		}), username, password, email);
    };

    this.inviteFriend = function(url, callback, username, password, email) {
	   	this.loginAndPerform(url, callback, Collactive.bind(this, function() {
        	this._saAPI.inviteFriend('Friends', this._asyncCallback(function (status) {
            	callback(status);
			}), true);
		}), username, password, email);
    };

    this.removeFriend = function(url, friend_id, callback, username, password, email) {
	   	this.loginAndPerform(url, callback, Collactive.bind(this, function() {
        	this._saAPI.removeFriend(friend_id, this._asyncCallback(function (status) {
            	callback(status);
			}), true);
		}), username, password, email);
    };

    this.removeInvite = function(url, friend_id, callback, username, password, email) {
	   	this.loginAndPerform(url, callback, 
							 Collactive.bind(this, function() {
        	this._saAPI.removeInvite(friend_id, this._asyncCallback(function (status) {
            	callback(status);
			}), true);
		}), username, password, email);
    };

    this.share = function(url, friend_ids, message, callback, username, password, email) {	   	
		
	   	this.loginAndPerform(url, callback, Collactive.bind(this, function() {
        	this._saAPI.share(message, this._asyncCallback(function (status) {
            	callback(status);
			}), true);
		}), username, password, email);

    };
	
    this.sendMessage = function(message_url, subject, content, callback, username, password, email) {
	   	this.loginAndPerform(message_url, callback, Collactive.bind(this, function() {
        	this._saAPI.sendMessage(subject, content, this._asyncCallback(function (status) {
            	callback(status);
			}), true);
		}), username, password, email);
    };
	
    this.replyToSharedVideo = function(url, toUsername, subject, message, videoID, callback, username, password, email){
	   	this.loginAndPerform(url, callback, Collactive.bind(this, function() {
        	this._saAPI.replyToSharedVideo(toUsername, subject, message, videoID, this._asyncCallback(function (status) {
            	callback(status);
			}), true);
		}), username, password, email);		
	}
    this.replyToMessage = function(url, messageID, toUsername, subject, content, callback, username, password, email) {
	   	this.loginAndPerform(url, callback, Collactive.bind(this, function() {
			this._saAPI.replyToMessage(messageID, toUsername, subject, content, this._asyncCallback(function (status) {
            	callback(status);
			}), true);
		}), username, password, email);
    };

	return this;
};

YouTube.prototype = new SiteAutomationFacade('youtube');
