﻿
var MCenter = function(uid,wid,lang){
    var me = this,E = Eanyee,D = E.Dom;
    this.baseUrl = "http://" + document.location.host;
    this.serviceUrl = this.baseUrl + "/MediaCenter/MCenterService.aspx?uid=" + uid + "&wid=" + wid;
    //var lang = {MC  : "",Close : "",Abort : "",Hide : "",AutoImport : "",AutoCreate : "",Ready : "",inProcess : "",SaveSetting : "",GetData : "",GetAlbumData : "",BuildData : "",BuildAlbumData : "",ImportData : "",ImportDataFromAblum : "",ImportComplete : "",ConnectInvalid : "",NumberOfImports : "",BuildMainTask : "",SavingSetting : "",ReloadWiseLine : "",AutoCreateLP : "",ImportAll : "",Title : "",AccountInvalid : ""};
    
    this.uid = uid;this.wid = wid; this.lang = lang || {};
    this.View = new MCView(this,lang);
    MCenter.agentUrl = this._agentUrl = this.baseUrl + "/agent.aspx";
    this.load = function(auto){
        this._autoRun = auto;
        me.View.Show();
        //if (auto) 
    }
    this.close = function(){
        me.View.Hide();
    }
    //this.View.bindCloseButton(this.close);
    
    this._configCallBack = E.delegate(this,function(value,ret){
        if (!value){
            this.status = "initFailure";
            return this.View.Error(ret.ERROR + ":" + ret.URL,true);
        }
        this.configs = value;
        
        this.View.initComplete(this.accounts,this.configs);
        if (this._autoRun) this.autoImport(this.accounts,this.configs);
    });
    this.addToXml2Account = function(account){
        if (account.toXml) return;
        account.toXml = E.delegate(account,function(){
            var xml = "<?xml version='1.0'?><Accounts>";
            xml += "<AutoCreateLifePiece>" + this.AutoCreateLifePiece + "</AutoCreateLifePiece>";
            for(var networkId in this){
                if (networkId=="AutoCreateLifePiece" || networkId=='toXml') continue;
                var acntForNet = this[networkId];
                if (!acntForNet.Remember) continue;
                xml += "<Account>";
                xml += "<NetworkId>" + networkId + "</NetworkId>";
                xml += "<NetworkUserName>" + acntForNet.NetWorkUserName + "</NetworkUserName>";
                xml += "<SupportTypes>" + acntForNet.SupportTypes + "</SupportTypes>";
                xml += "</Account>";
            }//end for in this
            xml += "</Accounts>";
            return xml;
        });
    }
     this._accountCallBack = E.delegate(this,function(value,ret){
        if (!value){
            this.status = "initFailure";
            return this.View.Error(ret.ERROR + ":" + ret.URL,true);
        }
        this.accounts = value;
        
        this.View.initComplete(this.accounts,this.configs);
        if (this._autoRun) this.autoImport(this.accounts,this.configs);
    });
    
   
    
    this.initialize = function(){
        this.status = "initing";
        var cfgUrl = this.serviceUrl + "&cmd=get_config";
        //alert(cfgUrl);
        Eanyee.connect({
			    URL : cfgUrl,
			    METHOD : "GET",
			    CONTENT_TYPE : "JSON"
        },this._configCallBack);
    
        var acntUrl = this.serviceUrl + "&cmd=get_account";
        Eanyee.connect({
			    URL : acntUrl,
			    METHOD : "GET",
			    CONTENT_TYPE : "JSON"
        },this._accountCallBack);
    }
    
    this.autoImport = function(){
        if (this.accounts && this.configs) 
        {
             this._maintasks = this.buildTasks(0);
            me.doTaskQueue();
        }
    }
    
    this.abort = function(){
        me.status = "abort";
        this.View.ProcessError(lang.ImportAborted);
        me._maintasks.status = 'abort';
    }
    //this.E.delegate();
    
    this.buildTasks = function(startPer){
        var ret = [];
        for(var networkId in this.configs){
            var account = this.accounts[networkId];
            if (!account)continue;
            // if we have not the account then do nothing
            if (!account.NetWorkUserName) continue;
            var config = this.configs[networkId];
            var webSites = config.WebSites;
            for(var i=0;i<webSites.length;i++){
                var web = webSites[i];
                var key = "{" + web.Name + "}";
                if (account.SupportTypes.indexOf(key)<0) continue;
                var task = {
                    NetworkId : networkId,
                    Name : web.Name,
                    UserId : account.UserId,
                    Account : account.NetWorkUserName,
                    Subtype : web.Subtype,
                    XPath : web.XPath,
                    Details : web.Details,
                    RssUrl : web.RssUrl
                };
                task.tasks = ret;
                ret.push(task);
            }
        }
        ret.per = (100 - startPer)/ret.length;
        return ret;
    }
    
    //----------
    this.saveSetting = function(accounts){
        this.status = "importing";
        me.importCount = 0;
        me._maintasks = [];
        this.View.ImportVisible('process');
        this.View.showAbortOrReturn();
        this.View.InitProcess();
        
        var processEl = this.View.ProcessError(lang.SaveSetting,1);
        var savingSettingUrl = this.serviceUrl + "&cmd=save_setting";
        me.addToXml2Account(accounts);
        var xml = accounts.toXml();
        Eanyee.connect({
			    URL : savingSettingUrl,
			    CONST_PARAMS :{'EL': processEl,"Tasks":me._maintasks},
			    METHOD : "POST",
			    CONTENT_TYPE : "JSON",
			    POST_DATA : "xml=" + escape(xml)
        },this._saveSettingCallBack);
    }
    this._maintasks = [];
    this._saveSettingCallBack = E.delegate(this,function(value,ret){
        var el = ret.CONST_PARAMS.EL;
        var tasks = ret.CONST_PARAMS.Tasks;
        if (tasks.status==='abort') return;
        if (value==null) {return this.View.Error(ret.error,true);}
        var startPer = 4 + parseInt((Math.random()*10));
        this.View.ProcessError(el, startPer);
        ret.CONST_PARAMS = undefined;
        var el = this.View.ProcessError(lang.BuildMainTask);
        this._maintasks = this.buildTasks(startPer);
        this.View.ProcessError(el);
        me.doTaskQueue();
    });
    var doTaskQueue;
    this.doMainTaskQueue = function(){
        if (me.status==='abort') return;
        var task = me._maintasks.pop();
        me.status = "importing";
        if (!task){
            me.status = "imported";
            me.View.importComplete(me.importCount);
            
            return;
        }
        
        task.per = me._maintasks.per;
        
        var startPer = 8 + parseInt((Math.random()*12));
        task.percentNumber = startPer;
        task.processText = me.View.ProcessError(me.lang.Validated.replace("$",task.Name));
           
        me.getNetworkUserId(task,function(task){
            me.View.ProcessError(task.processText,parseInt( task.per * task.percentNumber/100));
           me.getData(task);
        });
    }
    this._subtasks = [];
    this.doSubTaskQueue = function(){
        if (me.status==='abort') return;
        var task = me._subtasks.pop();
        while(task && task.tasks.status=='abort') me._subtasks.pop();
        if (!task){ 
            me.doTaskQueue = me.doMainTaskQueue;
            me.doTaskQueue();
            return;
        }
        task.per = me._subtasks.per;
        me.getData(task);
    }
    me.doTaskQueue = this.doMainTaskQueue;
    this.getNetworkUserId = function(task,callback){
        if (me.status==='abort' || task.tasks.status==='abort') return;
        if (task.UserId) callback(task);
        var valid = MCenter.AccountValidates[task.NetworkId];
        if (!valid){ 
            task.UserId = task.Account;
            callback(task);
            return;
        }
        valid(task.Account,function(v,context){
            if (me.status==='abort' || task.tasks.status==='abort') return;
            if (v==null) {
                //if we can't get the user id we drop current task and start next task.
                if (context.ERROR){
                    var pr =parseInt(task.per * (100-task.percentNumber)/100);
                    me.View.ProcessError(lang.ConnectInvalid.replace("$",task.Name));
                    //TODO : LANG
                }else me.View.ProcessError("Your account [" + task.Account + "] for "+task.Name+" is invalid.");
                task.processText = me.View.ProcessError(task.processText,pr,"not complete");
                me.doTaskQueue(me._maintasks);
            }else{
                task.UserId = v;
                callback(task);
            }
        });
    }
    this.getData = function(task){
        if (me.status==='abort' || task.tasks.status==='abort') return;
        var rssUrl = task.RssUrl;
        rssUrl = rssUrl.replace("{userid}",task.UserId);
		if (task.CategoryId)rssUrl = rssUrl.replace("{catagoryid}",task.CategoryId);
		
		task.processText = me.View.ProcessError(lang.GetData.replace("$",task.Name));
                
		Eanyee.connect({
			URL : rssUrl,
			CONST_PARAMS :task,
			//CONTENT_TYPE : "XML",
			METHOD : "GET"
		 },me._dataBack,me._agentUrl);
    }
    this.compareTime = function(){return true;} 
    this._dataBack = E.delegate(this,function(v,context){
        var task = context.CONST_PARAMS;
        if (me.status==='abort' || task.tasks.status==='abort') return;
        if (!v){
            
            me.View.ProcessError(task.processText,parseInt((100-task.percentNumber)*task.per/100),'not complete');
            me.doTaskQueue();
        } 
        var startPer = 15 + parseInt((Math.random()*20));
        task.percentNumber += startPer;
		me.View.ProcessError(task.processText,parseInt(startPer*task.per/100));
        var els = me.View.ProcessError(lang.BuildData.replace("$", task.Name));   
        var getT = Eanyee.Xml.getText;
		var selNd = function(nd,xpath){
		    if (xpath) return Eanyee.Xml.selectSingleNode(nd,xpath);
		    return null;
		}
		var gS = Eanyee.Xml.selectNodes;
		var task = context.CONST_PARAMS;
		var xpath = task.XPath;
		var allowImport = this.compareTime;
		
		var doc = Eanyee.Xml.createDocument(v,xpath.DefaultNS);
		var entrys = gS(doc,xpath.Entity);
		var subTasks = [],entries = [];
		for(var i=0;i<entrys.length;i++){
			var entry = entrys[i];
			var id = getT(selNd(entry,xpath.Id));
			var title = getT(selNd(entry,xpath.Title));
			var script = getT(selNd(entry,xpath.Description));
			var url = getT(selNd(entry,xpath.MediaUrl));
			var thumb = getT(selNd(entry,xpath.ThumbUrl));
			var publishTime = getT(selNd(entry,xpath.PublishedTime));
			var updatedTime = getT(selNd(entry,xpath.UpdatedTime));
			var ent = new Entry(id,title,script,url,thumb,publishTime);
			entries.push(ent);
			if (task.Details){
			    var subTask = {
			        NetworkId : task.NetworkId,
                    Name : title + "(" + task.Name + ")",
                    UserId : task.UserId,
                    Subtype : task.Subtype,
                    Account : task.NetWorkUserName,
                    XPath :  task.Details.XPath,
                    RssUrl : task.Details.RssUrl,
                    CategoryId : id,
                    percentNumber : 0 ,
                    Parent : ent,
                    tasks : task.tasks
			    }
			    subTasks.push(subTask);
			}else if (task.Parent){
			    var p = task.Parent;
			    if (!p.Details) p.Details = [];
			    p.Details.push(ent);
			}
		}//end for entrys; 
		var startPer = 17 + parseInt((Math.random()*10));
        task.percentNumber += startPer;
		me.View.ProcessError(els,parseInt(startPer*task.per/100));
		if (subTasks.length>0){
		    me._subtasks = subTasks;
		    subTasks.per = parseInt(task.per *(100- task.percentNumber) /(100*subTasks.length));
		    me.doTaskQueue = me.doSubTaskQueue;
		    me.doSubTaskQueue();
		    return;
		}else{
		    if (task.Parent)
		        me.importMedia([task.Parent],task);
		    else 
		        me.importMedia(entries,task);
		    return;
		}
    });
    this.importMedia = function(entries,task){
        var xml = ["<entries>"];
        for(var i=0;i<entries.length;i++){
            var entry = entries[i];
            xml.push(entry.toXml());
        }
        xml.push("</entries>");
        var xml = xml.join("");
        task.processText = me.View.ProcessError(lang.ImportData.replace("$", task.Name));
        var  url = me.serviceUrl + "&cmd=imports&networkId=" + escape(task.NetworkId) + "&createLP=" + me.accounts.AutoCreateLifePiece + "&subtype=" + task.Subtype;
        Eanyee.connect({
			URL : url ,
			CONST_PARAMS : task,
			METHOD : "POST",
			CONTENT_TYPE : "JSON",
			POST_DATA : "xml=" + escape(xml)
		 },me._importCallBack);
    }
    this._importCallBack = E.delegate(this, function(value,contenxt){
        var task = contenxt.CONST_PARAMS;
        if (me.status==='abort' || task.tasks.status==='abort') return;
        if (!value && value!==0){
            me.View.ProcessError(task.processText,task.per* (100-task.percentNumber)/100,"not complete");
            me.doTaskQueue();
            return;
        }
         me.View.ProcessError(task.processText,task.per* (100-task.percentNumber)/100);
         me.View.ProcessError(lang.NumberOfImports.replace("#",value));
         me.importCount += parseInt(value);
         me.doTaskQueue();
            
    });
    
    this.initialize();
}
var Entry = function(id , title,description,mediaUrl,thumbUrl,publishTime,updateTime){
    this.title = title;
    this.description = description;
    this.id = id;
    this.mediaUrl = mediaUrl;
    this.thumbUrl = thumbUrl;
    this.publishedTime = publishTime ; 
    this.updatedTime = updateTime;
    this.toXml = function(){
        var xml = "<entry>";
        if (this.id)xml += "<id>" + this.id + "</id>";
        xml += "<title>" + this.title.replace(/\&/g,"&amp;") + "</title>";
        if (this.description) xml += "<description>" + this.description.replace(/\&/g,"&amp;") + "</description>";
        xml += "<mediaUrl>" + this.mediaUrl.replace(/\&/g,"&amp;") + "</mediaUrl>";
        if (this.thumbUrl)xml += "<thumbUrl>" + this.thumbUrl.replace(/\&/g,"&amp;") + "</thumbUrl>";
        if (this.publishedTime)xml += "<publishedTime>" + this.publishedTime + "</publishedTime>";
        if (this.updatedTime)xml += "<updatedTime>" + this.updatedTime + "</updatedTime>";
        if (this.Details){
            xml += "<details>";
            for(var i=0;i<this.Details.length;i++){
                xml += this.Details[i].toXml();
            }
            xml += "</details>"
        }
        xml += "</entry>";
        return xml;
    }
}
MCenter.FlickrKEY = "9687fc0614d7377b130e01601799e39a";
MCenter.AccountValidates = {
    "www.Flickr.com" : function(account,callback){
        Eanyee.connect({
	        URL : "http://api.flickr.com/services/rest/?method=flickr.people.findByUsername&api_key="+MCenter.FlickrKEY+"&username=" + account,
		    CONTENT_TYPE : "XML",
		    METHOD : "GET"
		    },function(value,ret){
		        if (!value){if (callback) callback(null, ret); return;}
                var trueIdNode = Eanyee.Xml.selectSingleNode(value,"//rsp/user/@nsid");
	            var trueId = trueIdNode?Eanyee.Xml.getText(trueIdNode):null;
	            if (callback) callback(trueId,ret);
		    },MCenter.agentUrl);
    },
    "www.YouTube.com" : function(account,callback){
        Eanyee.connect({
	        URL : "http://gdata.youtube.com/feeds/api/users/" + account,
		    METHOD : "GET"
		    },function(value,ret){
		        if (!value){if (callback) callback(null,ret);return;}
                if (value.indexOf("User not found")>=0) callback(null,"UserNotFound");
                callback(account,ret);
		    },MCenter.agentUrl);
    },
     "www.Picasa.com" : function(account,callback){
        Eanyee.connect({
	        URL : "http://picasaweb.google.com/data/feed/api/user/" + account,
		    METHOD : "GET"
		    },function(value,ret){
		        if (!value){
		            if (callback){
		                if (ret.ERROR.code == 404) callback(null,"UserNotFound");
		                else callback(null,ret);
		            }
		            return;
		        }
                
                //if (value.indexOf("Invalid Email address")>=0) callback(null,"UserNotFound");
                callback(account,ret);
		    },MCenter.agentUrl);
    }
}