var oYoutubeInfo = {
        aLoading : [],
        aTagNames : ["img", "span"],
        
        
        
        loadVideoDetails : function (sVidId, oHandler){
            var iLoading;
        
            for(iLoading = 0; iLoading < this.aLoading.length; iLoading++){
                if(this.aLoading[iLoading].sVidId === sVidId){
                    this.aLoading[iLoading].aHandlers.push(oHandler);
                    return;
                }
            }
            
            this.aLoading.push({ sVidId : sVidId, aHandlers : [ oHandler ], bLoaded : false });
        },
        
        startLoadingVideoDetails : function(){
            while(this.aLoading.length > 0){
                this.doLoadVideoDetails(this.aLoading.pop());
            }
        },
        
        doLoadVideoDetails : function(oObj){
            var oXmlHttp = this.getXmlHttpRequest();
            
            oXmlHttp.onreadystatechange=function(){
                if(oXmlHttp.readyState == 4){
                    var aEntries, iEntry, iHandler;
                    
                    //  Search for entry nodes
                    aEntries = oXmlHttp.responseXML.getElementsByTagName("entry");
                    if(aEntries.length === 0){
                        aEntries = XmlHttp.responseXML.getElementsByTagName("m:entry");
                    }
                    
                    if(aEntries.length > 0){
                        for(iHandler = 0; iHandler < oObj.aHandlers.length; iHandler++){
                            oObj.aHandlers[iHandler].fHandler.call(oYoutubeInfo, oObj.aHandlers[iHandler], aEntries[0]);
                        }
                    }

                }
            }
            
            oXmlHttp.open("GET", "YoutubeInfo.asp?sYouTubeID=" + oObj.sVidId, true);
            oXmlHttp.send(null);
            
        },
	
        loadVideoImage : function (eImg, sVidId, iPrefHeight, iPrefWidth){
            if(typeof iPrefHeight === "undefined"){
                iPrefHeight = parseInt(eImg.getAttribute("ytPrefHeight"), 10);
            }
            if(typeof iPrefWidth === "undefined"){
                iPrefWidth = parseInt(eImg.getAttribute("ytPrefWidth"), 10);
            }
        
            this.loadVideoDetails(sVidId, { fHandler : this.handleVideoImage, eImg : eImg, iPrefHeight : iPrefHeight, iPrefWidth : iPrefWidth});
        },
	
        handleVideoImage :function (oRequest, oEntryNode){
            var aThumbs, iThumb, iCurrentThumb = 0, iCurrentHeight = 0, iCurrentWidth = 0, iHeight, iWidth;
            
            //  Search for thumb nodes
            aThumbs = oEntryNode.getElementsByTagName("media:thumbnail");
            if(aThumbs.length === 0){
                aThumbs = oEntryNode.getElementsByTagName("thumbnail");
            }
            
            if(aThumbs.length > 0){
                for(iThumb = 0; iThumb < aThumbs.length; iThumb++){
                    iHeight = parseInt(aThumbs[iThumb].getAttribute("height"), 10);
                    iWidth = parseInt(aThumbs[iThumb].getAttribute("width"), 10);
                    if(iHeight > iCurrentHeight && iHeight <= oRequest.iPrefHeight && iWidth > iCurrentWidth && iWidth <= oRequest.iPrefWidth){
                        
                        iCurrentThumb = iThumb;
                        iCurrentHeight = iHeight
                        iCurrentWidth =iWidth
                    }
                }
                
                oRequest.eImg.src = aThumbs[iCurrentThumb].getAttribute("url");
            }
        },
        
        loadVideoHits : function(eElem, sVidId){
            this.loadVideoDetails(sVidId, { fHandler : this.handleVideoHits, eElem : eElem });
        },
	
        handleVideoHits : function(oRequest, oEntryNode){
            var aStats, iHits;
            aStats = oEntryNode.getElementsByTagName("yt:statistics");
            if(aStats.length === 0){
                aStats = oEntryNode.getElementsByTagName("statistics");
            }
            
            if(aStats.length > 0){
                oRequest.eElem.innerHTML = this.formatNumber(aStats[0].getAttribute("viewCount"), 0);
            }
        },
        

        loadVideoLength : function(eElem, sVidId){
            this.loadVideoDetails(sVidId, { fHandler : this.handleVideoLength, eElem : eElem });
        },
	
        handleVideoLength : function(oRequest, oEntryNode){
            var aStats, iHits;
            aStats = oEntryNode.getElementsByTagName("yt:duration");
            if(aStats.length === 0){
                aStats = oEntryNode.getElementsByTagName("duration");
            }
            
            if(aStats.length > 0){
                oRequest.eElem.innerHTML = this.formatTime(parseInt(aStats[0].getAttribute("seconds"), 10));
            }
        },
        
        loadVideoRating : function(eElem, sVidId){
            this.loadVideoDetails(sVidId, { fHandler : this.handleVideoRating, eElem : eElem });
        },
	
        handleVideoRating : function(oRequest, oEntryNode){
            var aStats, iHits;
            aStats = oEntryNode.getElementsByTagName("gd:rating");
            if(aStats.length === 0){
                aStats = oEntryNode.getElementsByTagName("rating");
            }
            
            if(aStats.length > 0){
                oRequest.eElem.innerHTML = this.formatNumber(aStats[0].getAttribute("average"), 1);
            }
        },
        
        loadVideoPublished : function(eElem, sVidId){
            this.loadVideoDetails(sVidId, { fHandler : this.handleVideoPublished, eElem : eElem });
        },
	
        handleVideoPublished : function(oRequest, oEntryNode){
            var aStats, iHits;
            aStats = oEntryNode.getElementsByTagName("published");
            if(aStats.length === 0){
                aStats = oEntryNode.getElementsByTagName("m:published");
            }
            
            if(aStats.length > 0){
                oRequest.eElem.innerHTML = this.formatDate(aStats[0].firstChild.nodeValue);
            }
        },
        
        loadYoutubeDetails : function(){
            var iTag, iElem, aElements;
            
            for(iTag = 0; iTag < this.aTagNames.length; iTag++){
                aElements = document.getElementsByTagName(this.aTagNames[iTag]);
                
                for(iElem = 0; iElem < aElements.length; iElem++){
                    if(aElements[iElem].getAttribute("ytInfo") && aElements[iElem].getAttribute("ytID")){
                        switch(aElements[iElem].getAttribute("ytInfo")){
                            case "hits":
                                this.loadVideoHits(aElements[iElem], aElements[iElem].getAttribute("ytID"));
                                break;
                            case "img":
                                this.loadVideoImage(aElements[iElem], aElements[iElem].getAttribute("ytID"));
                                break;                            
                            case "length":
                                this.loadVideoLength(aElements[iElem], aElements[iElem].getAttribute("ytID"));
                                break;
                            case "rating":
                                this.loadVideoRating(aElements[iElem], aElements[iElem].getAttribute("ytID"));
                                break;                            
                                
                            case "published":
                                this.loadVideoPublished(aElements[iElem], aElements[iElem].getAttribute("ytID"));
                                break;
                                
                        }
                    }
                }
            }
            
            this.startLoadingVideoDetails();
        },
        
        
        
        formatNumber : function(sNr, iDecimals){
            var x, x1, x2, nNr 
            
            nNr = parseFloat(sNr);
            sNr = nNr.toFixed(iDecimals);
            
            
            x = sNr.split('.');
            x1 = x[0];
            x2 = x.length > 1 ? '.' + x[1] : '';
            var rgx = /(\d+)(\d{3})/;
            while (rgx.test(x1)) {
                x1 = x1.replace(rgx, '$1' + ',' + '$2');
            }
            return x1 + x2;
        },
      
        formatTime : function(secs){
           var times = new Array(3600, 60, 1);
           var time = '';
           var tmp;
           for(var i = 0; i < times.length; i++){
              tmp = Math.floor(secs / times[i]);
              if(tmp > 0 || i > 0){
                  if(tmp < 1){
                     tmp = '00';
                  }
                  else if(tmp < 10){
                     tmp = '0' + tmp;
                  }
                  time += tmp;
                  if(i < 2){
                     time += ':';
                  }
              }
              secs = secs % times[i];
           }
           return time;
        },
        
        formatDate : function(sDate){
            var iDay, iWeek, iMonth, iYear, dDate = this.parseDate(sDate), dCurrent = new Date();
            
            
            dCurrent.setDate(dCurrent.getDate() - 1);
            if(dCurrent < dDate){
                return "Today";
            }
            
            for(iDay = 1; iDay <= 7; iDay++){
                dCurrent.setDate(dCurrent.getDate() - 1);
                 
                if(dCurrent < dDate){
                    return iDay + (iDay > 1 ? " days ago" : " day ago");
                }
            }
            
            for(iWeek = 1; iWeek <= 4; iWeek++){
                dCurrent.setDate(dCurrent.getDate() - 7);
                 
                if(dCurrent < dDate){
                    return iWeek + (iWeek > 1 ? " weeks ago" : " week ago");
                }
            }
            
            dCurrent = new Date();
            for(iMonth = 1; iMonth <= 12; iMonth++){
                dCurrent.setMonth(dCurrent.getMonth() - 1);
                
                if(dCurrent < dDate){
                    return iMonth + (iMonth > 1 ? " months ago" : " month ago");
                }
            }
            
            dCurrent = new Date();
            for(iYear = 1; iYear <= 50; iYear++){
                dCurrent.setFullYear(dCurrent.getFullYear() - 1);
                
                if(dCurrent < dDate){
                    return iYear + (iYear > 1 ? " years ago" : " year ago");
                }
            }
        },
        
        parseDate : function(sDate){
            var sDat, sTim, aParts, dDate = new Date();
            
            sDat = sDate.split("T")[0];
            aParts = sDat.split("-");
            
            dDate.setYear(aParts[0]);
            dDate.setMonth(aParts[1] - 1);
            dDate.setDate(aParts[2]);
            
            sTim = sDate.split("T")[1];
            aParts = sTim.split(":");
            dDate.setHours(aParts[0]);
            dDate.setMinutes(aParts[1]);
            dDate.setSeconds(parseInt(aParts[2], 10));

            return dDate;
        },
        
        getXmlHttpRequest : function(){
        
            if (window.XMLHttpRequest){
                // code for IE7+, Firefox, Chrome, Opera, Safari
                return new XMLHttpRequest();
            }else if (window.ActiveXObject){
                // code for IE6, IE5
                return new ActiveXObject("Microsoft.XMLHTTP");
            }else{
                alert("Your browser does not support XMLHTTP!");
            }
        }
    }
    