window.ytPlayerObjArray = new Array();
function ytPlayer( playerId) {
    this.playerId = playerId;
    this.playerObj = document.getElementById( playerId);
    this.intervalId = -1;
    this.playVideoLoop = false;
    this.videoIdArray = null;
    this.currentVideoId = null;
    this.stateChangeHandler = null;
    this.recoverAttemptNum = -1;
    this.failedVideo = { firstVideoId: null, videoId: null, nextVideoId: null, failNum: 0};
}

function swfobjAttribsMold() {
    // Attribute to object tag
    this.id = null;     // When not speicified, object tag being generated automatically
                        // inherits the id from the alternative content container element
    this.name = null;
    this.styleclass = null;
    this.style = null;
    this.align = null;
}

/**
 * Factory to create data passed to SWFObject as params element data of object tag
 * All value should be String type
 */
function swfObjParamsMold() {
    // Flash specific param elements (http://www.adobe.com/cfusion/knowledgebase/index.cfm?id=tn_12701)
    // Also refer to http://code.google.com/p/swfobject/wiki/documentation
    this.play = null;
    this.loop = null;
    this.menu = null;
    this.quality = null;
    this.scale = null;
    this.salign = null;
    this.wmode = "Opaque";
    this.bgcolor = null;
    this.base = null;
    this.swliveconnect = null;
    this.flashvars = null;
    this.devicefont = null;
    this.allowscriptaccess = null;
    this.seamlesstabbing = null;
    this.allowfullscreen = null;
    this.allownetworking = null;

    // Custom param elements
    // All value should be string type
    this.videoIds = null;   // Specify IDs of videos to play sequentially
    this.currentVideoId = null;
    this.playVideoLoop = null;  // Switch to play specified videos in loop
    this.recoverAttemptNum = "-1";   // Specify number of continuous error times to give up recovery attempt
    this.stateChangeHandler = null;     // Name of function to handle state change of player
                                        // When playVideoLoop = "true" and/or videoIds data is provided,
                                        // this must be name of extended ytPlayerStateChangeHandler4LoopPlay function
    this.errorHandler = null;   // Name of function to handle error on player
    this.autoVideoPlay = null;  // Flag to automatically start playing video when player get ready
    this.mute = null;   // Flag to mute
    this.volume = null;     // Number between 0 to 100
    this.showCloseButton = "false";
} // function swfObjParamsMold()
/**
 * By specifying player ID, get YouTube player object stored in window.ytPlayerObjArray
 * Input:
 *  ytPlayerId: value of id attribute passed to swfobject.embedSWF
 *  (value of id attribute of Object tag generated by swfobject.embedSWF)
 * Output:
 *  Normal: ytPlayer object
 *  Error: null
 * Called from:
 *  ytPlayerStateChangeHandler4LoopPlay
 */
function getYtPlayerFromHolder( ytPlayerId) {
   var ytPlayerObj = null;
   for( var ytPlayerIndex in window.ytPlayerObjArray) {
       ytPlayerObj = window.ytPlayerObjArray[ ytPlayerIndex];
       if ( ytPlayerObj.playerId == ytPlayerId) {
           break; // for
       }
       ytPlayerObj = null;
   } // for
   return ytPlayerObj;
} // function getYtPlayerFromHolder( ytPlayerId)
function removeYtPlayerFromHolder( ytPlayerId) {
    var returnCode = false;
    if ( window.ytPlayerObjArray.length > 0) {
        for( var ytPlayerIndex = 0; ytPlayerIndex < window.ytPlayerObjArray.length; ytPlayerIndex++) {
           ytPlayerObj = window.ytPlayerObjArray[ ytPlayerIndex];
           if ( ytPlayerObj.playerId == ytPlayerId) {
               window.ytPlayerObjArray.splice( ytPlayerIndex, 1);
               returnCode = true;
               break; // for
           }
           ytPlayerObj = null;
        } // for
    }
    return returnCode;
} // function removeYtPlayerFromHolder( ytPlayerId)
function addYtPlayerIdIntoHolder( ytPlayerId) {
    var returnCode = false;
    if ( getYtPlayerFromHolder( ytPlayerId) == null) {
        var ytPlayerToAdd = document.getElementById( ytPlayerId);
        if ( ( typeof ytPlayerToAdd).toLowerCase() == "object" ) {
            if ( ytPlayerToAdd != null) {
                if ( ytPlayerToAdd.nodeType == 1) {
                    window.ytPlayerObjArray.push( ytPlayerObj);
                    returnCode = true;
                }
            }
        }
    }
    return returnCode;
} // function addYtPlayerIntoHolder( ytPlayerId)
function addYtPlayerObjIntoHolder( ytPlayerObj) {
    var returnCode = false;
    if ( (typeof ytPlayerObj).toLowerCase() == "object") {
        if ( ytPlayerObj != null) {
            if ( ( typeof ytPlayerObj.playerId).toLowerCase() == "string") {
                if ( getYtPlayerFromHolder( ytPlayerObj.playerId) == null) {
                    window.ytPlayerObjArray.push( ytPlayerObj);
                    returnCode = true;
                }
            }
        }
    }
    return returnCode;
} // function addYtPlayerIntoHolder( ytPlayerId)

function getNodeCordinate( domNode) {
  if( (typeof domNode.offsetParent).toLowerCase() != 'undefined' ) {
    for( var posX = 0, posY = 0; domNode; domNode = domNode.offsetParent ) {
      posX += domNode.offsetLeft;
      posY += domNode.offsetTop;
    } // for
    return [ posX, posY ];
  } else {
    return [ domNode.x, domNode.y ];
  }
} // getCordinate( domNode)
function ytPlayerCloser( ytPlayerCloseButtonNodeInput, ytPlayerNodeInput) {
    this.ytPlayerCloseButtonNode = ytPlayerCloseButtonNodeInput;
    this.ytPlayerNode = ytPlayerNodeInput;
    this.closeButtonClickListener = null;
    this.closeYtPlayer =
        function() {
            this.ytPlayerNode.pauseVideo();
            this.ytPlayerNode.style.display = "none";

            if ( this.closeButtonClickListener != null) {
                google.maps.Event.removeListener( this.closeButtonClickListener);
            }
            this.ytPlayerCloseButtonNode.parentNode.parentNode.removeChild( this.ytPlayerCloseButtonNode.parentNode);
        };
}

function getMaxZIndex() {
    var allDocElements = document.getElementsByTagName ? document.getElementsByTagName( "*") : document.all;
    var maxZIndex = 0;
    for( var i = 0 ; i < allDocElements.length ; i++) {
        var elementInDoc = allDocElements[ i];

        var elementCssStyle = null;
        if ( elementInDoc.currentStyle) {
            elementCssStyle = elementInDoc.currentStyle;
        }
        else if ( document.defaultView && document.defaultView.getComputedStyle) {
            elementCssStyle = document.defaultView.getComputedStyle( elementInDoc,"");
        }

        var elementZIndex;
        if ( elementCssStyle) {
            elementZIndex = Number( elementCssStyle.zIndex);
        } else {
            elementZIndex = Number( elementInDoc.style.zIndex);
        }

        if ( !isNaN( elementZIndex)) {
            maxZIndex = Math.max( maxZIndex, elementZIndex);
        }
    }
    
    return maxZIndex;
} // function getMaxZIndex()

function addYtPlayerCloseButton( ytPlayerNode) {

    var ytPlayerCloseButtonNode = document.createElement( "div");
    ytPlayerCloseButtonNode.style.cursor = "pointer";
    ytPlayerCloseButtonNode.style.width = "1em";
    ytPlayerCloseButtonNode.style.height = "1em";
    ytPlayerCloseButtonNode.style.fontSize = "125%";
    ytPlayerCloseButtonNode.style.color = "white";
    ytPlayerCloseButtonNode.style.backgroundColor = "gray";
    ytPlayerCloseButtonNode.style.textAlign = "center";
    ytPlayerCloseButtonNode.style.styleFloat = "right";
    ytPlayerCloseButtonNode.style.cssFloat = "right";
    ytPlayerCloseButtonNode.setAttribute( "title", "Close");
    ytPlayerCloseButtonNode.appendChild( document.createTextNode( "\u2297"));

    // Attach ytPlayer closing handler to close button node
    var ytPlayerCloserObj = new ytPlayerCloser( ytPlayerCloseButtonNode, ytPlayerNode);
//    var closeYtPlayerCallbackHandler = google.maps.Event.callback( ytPlayerCloserObj, ytPlayerCloserObj.closeYtPlayer);
//    google.maps.Event.addDomListener( ytPlayerCloseButtonNode, "click", closeYtPlayerCallbackHandler);
    var closeYtPlayerClickListener = 
        google.maps.Event.bindDom( ytPlayerCloseButtonNode, "click", ytPlayerCloserObj, ytPlayerCloserObj.closeYtPlayer);
    ytPlayerCloserObj.closeButtonClickListener = closeYtPlayerClickListener;


    var ytPlayerCloserParentNode = document.createElement( "div");
    if ( ytPlayerNode.style.width) {
        ytPlayerCloserParentNode.style.width = ytPlayerNode.style.width;
    }
    else {
        var ytPlayerNodeWidth = ytPlayerNode.getAttribute( "width");
        if ( ytPlayerNodeWidth.search( "\\D$") < 0) {
            ytPlayerCloserParentNode.style.width = ytPlayerNodeWidth + "px";
        }
        else {
            ytPlayerCloserParentNode.style.width = ytPlayerNodeWidth;
        }
    }
    ytPlayerCloserParentNode.style.position = "absolute";
    var ytPlayerCordinate = getNodeCordinate( ytPlayerNode);
    ytPlayerCloserParentNode.style.left = ytPlayerCordinate[ 0];
    ytPlayerCloserParentNode.style.top = ytPlayerCordinate[ 1];
    ytPlayerCloserParentNode.style.zIndex = getMaxZIndex() + 1;     // z-index only works with absolute positioning
    ytPlayerCloserParentNode.style.cursor = "default";
    ytPlayerCloserParentNode.appendChild( ytPlayerCloseButtonNode);

    ytPlayerNode.parentNode.insertBefore( ytPlayerCloserParentNode, ytPlayerNode);
}

function onYouTubePlayerReady( playerId) { // This function is called once when each player get ready

    var ytPlayerObj = new ytPlayer( playerId);
    if ( ytPlayerObj.playerObj.nodeType != 1) {
        alert( "Could not locate object tag with id: " + playerId);
        return;
    }
    if ( ytPlayerObj.playerObj.hasChildNodes()) {
        var childNodeList = ytPlayerObj.playerObj.childNodes;
        for( var childNodeIndex = 0; childNodeIndex < childNodeList.length; childNodeIndex++) {
            var childNodeObj = childNodeList[ childNodeIndex];
            if ( childNodeObj.nodeType == 1) {
                if ( childNodeObj.tagName.toLowerCase() == "param") {

                    var attributeName = childNodeObj.getAttribute( "name");
                    if ( ( typeof attributeName).toLowerCase() != "undefined") {
                        if ( attributeName != null) {

                            var attributeValue = childNodeObj.getAttribute( "value");
                            if ( (typeof attributeValue).toLowerCase() != "undefined") {
                                if ( attributeValue != null) {
                                    attributeValue = attributeValue.replace( new RegExp( "^ +"), "", "g");
                                    attributeValue = attributeValue.replace( new RegExp( " +$"), "", "g");
                                    if ( attributeValue.length > 0) {

                                        attributeName = attributeName.toString().toLowerCase();

                                        if ( attributeName == "videoids") {
                                           var videoIdArray = attributeValue.split( ",");
                                           if ( videoIdArray.length > 0) {
                                               for( var videoIdIndex = 0; videoIdIndex < videoIdArray.length; videoIdIndex++) {
                                                   var videoId = videoIdArray[ videoIdIndex];
                                                   videoId = videoId.replace( new RegExp( "^ +"), "");
                                                   videoId = videoId.replace( new RegExp( " +$"), "");
                                                   videoIdArray[ videoIdIndex] = videoId;
                                               } // for

                                               ytPlayerObj.videoIdArray = videoIdArray;
                                           }
                                        }
                                        else if ( attributeName == "currentvideoid") {
                                            ytPlayerObj.currentVideoId = attributeValue;
                                        }
                                        else if ( attributeName == "playvideoloop") {
                                            ytPlayerObj.playVideoLoop = attributeValue;
                                        }
                                        else if ( attributeName == "recoverattemptnum") {
                                            attributeValue = new Number( attributeValue);
                                            if ( attributeValue != NaN) {
                                                ytPlayerObj.recoverAttemptNum = attributeValue.valueOf();
                                            }
                                        }
                                        else if ( attributeName == "statechangehandler") {
                                            ytPlayerObj.stateChangeHandler = attributeValue;
                                            ytPlayerObj.playerObj.addEventListener( "onStateChange", attributeValue);
                                        }
                                        // From here, value won't be stored for future reference, it just set player now
                                        else if ( attributeName == "errorhandler") {
                                            ytPlayerObj.playerObj.addEventListener( "onError", attributeValue);
                                        }
                                        else if ( attributeName == "volume") {
                                            attributeValue = new Number( attributeValue);
                                            if ( attributeValue != NaN) {
                                                if ( ( 0 <= attributeValue) && ( attributeValue <= 100)) {
                                                    ytPlayerObj.playerObj.setVolume( attributeValue.valueOf());
                                                }
                                            }
                                        }
                                        else if ( attributeName == "mute") {
                                            attributeValue = attributeValue.toString().toLowerCase();
                                            if ( ( attributeValue == "false") || ( attributeValue == "no")) {
                                                ytPlayerObj.playerObj.unMute();
                                            }
                                            else if ( ( attributeValue == "true") || ( attributeValue == "yes")) {
                                                ytPlayerObj.playerObj.mute();
                                            }
                                        }
                                        else if ( attributeName == "autovideoplay") {
                                            attributeValue = attributeValue.toString().toLowerCase();
                                            if ( ( attributeValue == "true") || ( attributeValue == "yes")) {
                                                ytPlayerObj.playerObj.playVideo();
                                            }
                                        }
                                        else if ( attributeName == "showclosebutton") {
                                            if ( ( attributeValue == "true") || ( attributeValue == "yes")) {
                                                // Add close button
                                                addYtPlayerCloseButton( ytPlayerObj.playerObj);
                                            }
                                        }

                                    }
                                }
                            }
                        }
                    }
                }
            }
        } // for
    }

//                ytPlayerObj.intervalId = setInterval( ytPlayerObj.checkOnYTPlayer, 250);
    addYtPlayerObjIntoHolder( ytPlayerObj);

} // onYouTubePlayerReady( playerId)

/**
 * Get value of currentVideoId param node
 * Input:
 *  ytPlayerObj: ytPlayer object
 * Output:
 *  Normal: value of currentVideoId param node
 *  Error: null
 */
function readCurrentVideoIdParam( ytPlayerObj) {
    if ( !ytPlayerObj.playerObj) return null;
    if ( !ytPlayerObj.playerObj.nodeType != 1) return null;
    if ( !ytPlayerObj.playerObj.hasChildNodes()) return null;

    var childNodeList = ytPlayerObj.playerObj.childNodes;
    for( var childNodeIndex = 0; childNodeIndex < childNodeList.length; childNodeIndex++) {
        var childNodeObj = childNodeList[ childNodeIndex];
        if ( childNodeObj.nodeType == 1) {
            if ( childNodeObj.tagName.toLowerCase() == "param") {
                var attributeName = childNodeObj.getAttribute( "name");
                if ( !attributeName) {
                    attributeName = attributeName.toString().toLowerCase();
                    if ( attributeName == "currentvideoid") {
                        var currentVideoIdParamValue = childNodeObj.getAttribute( "value");
                        if ( currentVideoIdParamValue) return currentVideoIdParamValue;
                        else return null;
                    }
                }
            }
        }
    } // for

    return null;
} // function readCurrentVideoIdParam( ytPlayerObj)

/**
 * Get Id of video which is currently playing or just has been played
 * Input:
 *  ytPlayerObj: ytPlayer object
 * Output:
 *  Normal: video ID
 *  Error: null
 * Called from:
 *  getNextYtVideoId2Play
 */
function getCurrentYtVideoId( ytPlayerObj) {
   var currentYtVideoIdValue = null;

   var ytVideoUrl = ytPlayerObj.playerObj.getVideoUrl();
   if ( !ytVideoUrl) { // Case video is not allowed of embedding or video does not exist at all
        currentYtVideoIdValue = readCurrentVideoIdParam( ytPlayerObj);
        if ( !currentYtVideoIdValue) { 
            // Try to get current video id from failure record
            currentYtVideoIdValue = ytPlayerObj.failedVideo.videoId;
            if ( !currentYtVideoIdValue) return null;
        }
       return currentYtVideoIdValue;
   }
   else {
       var videoIdIndexInUrl = ytVideoUrl.search( new RegExp( "[\?\&]v=","i"));
       if ( videoIdIndexInUrl < 0) return null;
       currentYtVideoIdValue = ytVideoUrl.substr( videoIdIndexInUrl + 3);
       if ( currentYtVideoIdValue.indexOf( "&") > -1) {
           currentYtVideoIdValue = currentYtVideoIdValue.substring( 0, currentYtVideoIdValue.indexOf( "&"));
       }
       return currentYtVideoIdValue;
   }

} // function getCurrentYtVideoId( ytPlayerObj)

/**
 * Get ID of video being played next from ytPlayerObj.videoIdArray
 * Input:
 *  ytPlayerObj: ytPlayer object
 * Output:
 *  Normal: ID of video being played next from ytPlayerObj.videoIdArray
 *      Irregular cases:
 *      ID of video at top of ytPlayerObj.videoIdArray when video has not been set at all
 *      Current video ID when ytPlayerObj.videoIdArray is null and ytPlayerObj.playVideoLoop true
 *      ID of video at top of ytPlayerObj.videoIdArray when current video ID is the last in ytPlayerObj.videoIdArray
 *      ID of video at top of ytPlayerObj.videoIdArray when current video ID doesn't exist in ytPlayerObj.videoIdArray
 *  Error: null
 */
function getNextYtVideoId2Play( ytPlayerObj) {
    var currentVideoId = getCurrentYtVideoId( ytPlayerObj);

   var nextVideoId = null;

    if ( currentVideoId == null) {
// It will become infinite loop when the videoIdArray[ 0] video banned embeding
       if ( ytPlayerObj.videoIdArray != null) {
           nextVideoId = ytPlayerObj.videoIdArray[ 0];
       }
    }
    else {
       if ( ytPlayerObj.videoIdArray == null) {
           if ( ytPlayerObj.playVideoLoop) {
               // Play current video again
               nextVideoId = currentVideoId;
           }
       }
       else {
           for( var videoIdIndex = 0; videoIdIndex < ytPlayerObj.videoIdArray.length; videoIdIndex++) {
               var videoId = ytPlayerObj.videoIdArray[ videoIdIndex];
               if ( videoId == currentVideoId) {
                   if ( videoIdIndex < ( ytPlayerObj.videoIdArray.length - 1)) {
                       nextVideoId = ytPlayerObj.videoIdArray[ videoIdIndex + 1];
                   }
                   else { // id of current video is at last entry in ytPlayerObj.videoIdArray
                       if ( ytPlayerObj.playVideoLoop) {
                           nextVideoId = ytPlayerObj.videoIdArray[ 0];
                       }
                   }
                   break; // for
               }
           } // for
           if ( nextVideoId == null) { // current video's ID didn't exist in ytPlayerObj.videoIdArray
               if ( ytPlayerObj.playVideoLoop) {
                   nextVideoId = ytPlayerObj.videoIdArray[ 0];
               }
           }
       }
    }

   return nextVideoId;
} // function getNextYtVideoId2Play( ytPlayerObj, removeCurrentVideoFlag)


/**
* Plays video(s) (of which IDs are specified by videoIds param) in
* loop sequentially when playVideoLoop param is true
* When no ID(s) specified by videoIds param, then it will keep playing current video
 * Input:
 *  ytPlayerId: value of id attribute passed to swfobject.embedSWF
 *  (value of id attribute of Object tag generated by swfobject.embedSWF)
 *  newState:
 * Output:
 *  Normal: Playing video loop on YouTube player specified by ytPlayerId
 *  Error: Do nothing, just return
*/
function ytPlayerStateChangeHandler4LoopPlay( ytPlayerId, newState) {
   if ( newState != 0) return;
   
   var ytPlayerObj = getYtPlayerFromHolder( ytPlayerId);
   if ( ytPlayerObj == null) return;

   // Check if it's end of video
   var videoCurrentTime = ytPlayerObj.playerObj.getCurrentTime();
   var videoDuration = ytPlayerObj.playerObj.getDuration();
   if ( ( videoDuration - 3) > videoCurrentTime) { // videoCurrentTime != videoDuration even at video play to ends
       // Video play was stopped by user, not case that video reached playing to its end
       return;
   }

   var nextVideoId = getNextYtVideoId2Play( ytPlayerObj);
   if ( nextVideoId == null) return;

   ytPlayerObj.playerObj.clearVideo();

    if ( ytPlayerObj.playerObj.hasChildNodes()) { // ytPlayerObj.playerObj should have videoIds param child node
        var childNodeList = ytPlayerObj.playerObj.childNodes;
        var addCurrentVideoIdParamFlag = false;
        for( var childNodeIndex = 0; childNodeIndex < childNodeList.length; childNodeIndex++) {
            var childNodeObj = childNodeList[ childNodeIndex];
            if ( childNodeObj.nodeType == 1) {
                if ( childNodeObj.tagName.toLowerCase() == "param") {
                    var attributeName = childNodeObj.getAttribute( "name");
                    if ( !attributeName) {
                        attributeName = attributeName.toString().toLowerCase();
                        if ( attributeName == "currentvideoid") {
                            childNodeObj.setAttribute( "value", nextVideoId);
                            addCurrentVideoIdParamFlag = true;
                            break; // for
                        }
                    }
                }
            }
        } // for

        if ( !addCurrentVideoIdParamFlag) {
            var currentVideoIdParamNode = document.createElement( "param");
            currentVideoIdParamNode.setAttribute( "name", "currentVideoId");
            currentVideoIdParamNode.setAttribute( "value", nextVideoId);
            ytPlayerObj.playerObj.appendChild( currentVideoIdParamNode);
        }
    }


   ytPlayerObj.playerObj.loadVideoById( nextVideoId);

} // function ytPlayerStateChangeHandler4LoopPlay( ytPlayerId, newState)

function ytPlayerErrorHandler4LoopPlay( ytPlayerId, errorCode) {

   var ytPlayerObj = getYtPlayerFromHolder( ytPlayerId);
   if ( ytPlayerObj == null) return;

   // When state change handler wasn't set, cannot do error recovery for sequence/loop play
   if ( ytPlayerObj.stateChangeHandler == null) return;
   
   var videoId = getCurrentYtVideoId( ytPlayerObj);
   if ( videoId == null) return;

   var nextVideoId = getNextYtVideoId2Play( ytPlayerObj);
   if( nextVideoId == null) return;

   if ( ytPlayerObj.failedVideo.failNum < 1) { // First failure of playing video
       ytPlayerObj.failedVideo.firstVideoId = videoId;
       ytPlayerObj.failedVideo.videoId = videoId;
       ytPlayerObj.failedVideo.nextVideoId = nextVideoId;
       ytPlayerObj.failedVideo.failNum = 1;

       ytPlayerObj.playerObj.stopVideo();   // Let state change handler function:
                                            // ytPlayerStateChangeHandler4LoopPlay play next video
   }
   else {
       if ( videoId != ytPlayerObj.failedVideo.nextVideoId) { // There was video successfully played (since last error)
           ytPlayerObj.failedVideo.firstVideoId = videoId;
           ytPlayerObj.failedVideo.videoId = videoId;
           ytPlayerObj.failedVideo.nextVideoId = nextVideoId;
           ytPlayerObj.failedVideo.failNum = 1;
           
           ytPlayerObj.playerObj.stopVideo();   // Let state change handler function:
                                                // ytPlayerStateChangeHandler4LoopPlay play next video
       }
       else { // Failure sequentially from last one
           if ( nextVideoId == ytPlayerObj.failedVideo.firstVideoId) { // All video failed
               // Do not try to recover for playing any more videos
               ytPlayerObj.playerObj.pauseVideo();
           }
           else {
               ytPlayerObj.failedVideo.failNum++;
               if ( ( ytPlayerObj.recoverAttemptNum < 0) || ( ytPlayerObj.failedVideo.failNum < ytPlayerObj.recoverAttemptNum)){
                   ytPlayerObj.failedVideo.videoId = videoId;
                   ytPlayerObj.failedVideo.nextVideoId = nextVideoId;
                   
                   ytPlayerObj.playerObj.stopVideo();   // Let state change handler function:
                                                        // ytPlayerStateChangeHandler4LoopPlay play next video
               }
               else { // ytPlayerObj.failedVideo.failNum >= ytPlayerObj.recoverAttemptNum
                   // Do not try to recover for playing any more videos
                   ytPlayerObj.playerObj.pauseVideo();
               }
           }
       }

   }

} // function ytPlayerErrorHandler4LoopPlay( ytPlayerId)



