var mavenVideo = {
/*
INPUTS
-- theContainer
   id of the HTML element to be populated
-- theUrl
   url of the feed
-- type
   CSS class that will determine the orientation
   of the HTML to be returned...mavenDefault for 
   left-to-right in the left column, mavenAlt for
   top-to-bottom in the right column)
-- destUrl
   the destination url (the page the Maven player resides on)
-- startIndex,
   the start index ("if the start index is at 3,
   start at the 4th item in the feed")
-- feedDataType
   data type of the feed (optional)...currently the only two options are RSS and JSON...if no data type is specified, the script assumes JSON.
*/

   init: function( theContainer, theUrl, type, destUrl, startIndex, feedDataType, playlist ) {
      mavenVideo.renderVideos(
                              theContainer, theUrl, type,
                              destUrl, startIndex, feedDataType, playlist
                              );
   },

   renderVideos: function( theContainer, theUrl, type, destUrl, startIndex, feedDataType, playlist ) {
      //var theEvent = this;
      //alert(theEvent);
      try {
         var requester = new XMLHttpRequest();
      } catch( error ) {
         try {
            var requester = new ActiveXObject( "Microsoft.XMLHTTP" );
         } catch( error ) {
            var requester = null;
         }
      }

      if ( requester != null ) {
         /*theEvent._timer = setTimeout(
            function(){
               requester.abort();
               mavenVideo.writeError("The server is unable to process the request at this time.");
            },
         10000); */
         requester.open( "GET", theUrl, true );
         requester.onreadystatechange = function() {
           /* clearTimeout(theEvent._timer); */
           if ( requester.readyState == 4 ) {
             if ( requester.status == 200 || requester.status == 304 ) {
                //choose rendering based on datatype
                //default to JSON if no datatype provided
                switch( feedDataType ) {
                    case 'RSS':
                       mavenVideo.writeFromRss(
                                               requester.responseXML, theContainer, type,
                                               destUrl, startIndex, playlist
                                               );
                    break;
                    case 'JSON':
                       mavenVideo.writeFromJson(
                                                requester.responseText, theContainer, type,
                                                destUrl, startIndex, playlist
                                                );                     
                    break;
                    default:
                       mavenVideo.writeFromJson(
                                                requester.responseText, theContainer, type,
                                                destUrl, startIndex, playlist
                                                );
                    break;
                }
             } else {
               mavenVideo.writeError( 'The server was unable to be contacted.' );
             }
           }
         };
         requester.send( null );
      }
   },

   writeFromRss: function( responseXml, theContainer, type, destUrl, startIndex, playlist ) {

      //tidy container
      var videoBag = document.getElementById( theContainer );
      while ( videoBag.hasChildNodes() ) {
         videoBag.removeChild( videoBag.lastChild );
      }

      //set up counter and startIndex
      var data = responseXml.getElementsByTagName( 'item' );
      if ( startIndex > data.length ) {
         startIndex = 0;
      }


      //write out the data
      for (var i = startIndex; i < data.length; i++ ) {

         // get the XML data
         var clipTitle = data[i].getElementsByTagName('title')[0].firstChild.nodeValue;
         var clipLength = data[i].getElementsByTagName('duration')[0].firstChild.nodeValue;
         var clipID = data[i].getElementsByTagName('videoId')[0].firstChild.nodeValue;

         if ( document.getElementsByTagNameNS ) {
            var clipImgPre = data[i].getElementsByTagNameNS('*','thumbnail');
            var clipImg = clipImgPre[0].getAttribute('url');
            var clipDescPre = data[i].getElementsByTagNameNS('*','description');
            var clipDesc = clipDescPre[0].firstChild.nodeValue;
         } else {
            clipImg = data[i].getElementsByTagName('media:thumbnail')[0].getAttribute('url');
            clipDesc = data[i].getElementsByTagName('media:description')[0].firstChild.nodeValue;
         }

         //write out the data
         mavenVideo.writeUpdate( videoBag, type, destUrl, clipTitle, clipImg, clipDesc, clipLength, clipID, playlist );
      }

   },

   writeFromJson: function( responseText, theContainer, type, destUrl, startIndex, playlist ) {

      var data = eval( '(' + responseText + ')' );

      //get the data and ensure only 5 results get returned
      var dataExtracted = new Array();
      var dataItems = data.items;

      for ( i = 0; i < dataItems.length; i++ ) {
         dataExtracted.push( dataItems[i] );
      }

      if ( startIndex > dataExtracted.length ) {
         startIndex = 0;
      }

      var firstFive = dataExtracted.splice( startIndex, 5 );

      //tidy container
      var videoBag = document.getElementById( theContainer );
      while ( videoBag.hasChildNodes() ) {
         videoBag.removeChild( videoBag.lastChild );
      }

      //write out the data
      for ( i = 0; i < firstFive.length; i++ ) {
         //get the JSON data
         var clipTitle = firstFive[i].title;
         var clipImg = firstFive[i].thumbnailURL;
         var clipDesc = firstFive[i].description;
         var clipLength = firstFive[i].length;
         var clipID = firstFive[i].contentID;

         //write out the data
         mavenVideo.writeUpdate( videoBag, type, destUrl, clipTitle, clipImg, clipDesc, clipLength, clipID, playlist );
      }

   },

   writeUpdate: function( videoBag, type, destUrl, clipTitle, clipImg, clipDesc, clipLength, clipID, playlist ) {
      playlistID = destUrl + "?playlistId=" + playlist + "\u0026" + "videoId=" + clipID;

      var mavenShell = document.createElement( 'div' );
      mavenShell.className = 'mavenLink';

      var mavenThmbShell = document.createElement( 'div' );
      mavenThmbShell.className = 'mavenIco';

      var mavenThmbLink = document.createElement( 'a' );
      mavenThmbLink.setAttribute( 'href', playlistID );
      mavenThmbLink.setAttribute( 'title', clipTitle );
      var mavenThmbLinkText = document.createTextNode( "\u00A0" );
      mavenThmbLink.appendChild( mavenThmbLinkText );

      var mavenThmbImg = document.createElement( 'img' );
      mavenThmbImg.setAttribute( 'src', clipImg );
      mavenThmbImg.setAttribute( 'width', '90' );
      mavenThmbImg.setAttribute( 'height', '68' );
      mavenThmbImg.setAttribute( 'alt', clipTitle );

      var mavenSummary = document.createElement( 'div' );
      mavenSummary.className = 'summary';

      var mavenMetaLinks = document.createElement( 'p' );
      mavenMetaLinks.className = 'cta clearfix';

      var mavenMetaWatch = document.createElement( 'a' );
      mavenMetaWatch.setAttribute( 'href', playlistID );
      var mavenMetaWatchText = document.createTextNode( 'Watch' );
      mavenMetaWatch.appendChild( mavenMetaWatchText );

      var mavenMetaDur = document.createElement( 'span' );
      mavenMetaDur.className = 'mavenDuration';

      var mavenMetaDurText = document.createTextNode( mavenVideo.formatMs( clipLength ) );
      mavenMetaDur.appendChild( mavenMetaDurText );

      mavenMetaLinks.appendChild( mavenMetaWatch );
      mavenMetaLinks.appendChild( mavenMetaDur );

      var mavenTitle = document.createElement( 'h3' );

      var mavenTitleLink = document.createElement( 'a' );
      mavenTitleLink.setAttribute( 'href', playlistID );
      var mavenTitleLinkText = document.createTextNode( clipTitle );
      mavenTitleLink.appendChild( mavenTitleLinkText );
      mavenTitle.appendChild( mavenTitleLink );

      //display description conditionally
      if ( type != 'mavenDefault' ) {
         var mavenDescription = document.createElement( 'p' );
         var mavenDescText = document.createTextNode( mavenVideo.truncate( clipDesc, 100, '...' ) );
         mavenDescription.appendChild( mavenDescText );
      } else {
         //do nothing
      }

      //begin concatenating all the DOM elements together
      mavenThmbShell.appendChild( mavenThmbLink );
      mavenThmbShell.appendChild( mavenThmbImg );

      //switch rendering of HTML based on type
      if ( type != 'mavenDefault' ) { //alt rendering
         mavenSummary.appendChild( mavenTitle );
         mavenSummary.appendChild( mavenDescription );
         mavenSummary.appendChild( mavenMetaLinks );
      } else { //default rendering
         mavenSummary.appendChild( mavenMetaLinks );
         mavenSummary.appendChild( mavenTitle );
      }

      mavenShell.appendChild( mavenThmbShell );
      mavenShell.appendChild( mavenSummary );

      //add to the main container
      videoBag.appendChild( mavenShell );
   },

   writeError: function( errorMsg ) {
      alert( errorMsg );
   },

   /*
   Input parameters:
   String text, Number length, String ellipsis
   Returns: String text
   */
   truncate: function( text, length, ellipsis ) {
      // Set length and ellipsis to defaults if not defined
      if ( typeof length == 'undefined' ) {
         var length = 100;
      }
      if ( typeof ellipsis == 'undefined' ) {
         var ellipsis = '...';
      }
      // Return if the text is already lower than the cutoff
      if ( text.length < length ) {
         return text;
      }
      /* Otherwise, check if the last character is a space.
      If not, keep counting down from the last character
      until we find a character that is a space */
      for ( var i = length - 1; text.charAt(i) != ' '; i-- ) {
         length--;
      }
      /* The for() loop ends when it finds a space, and the length var
      has been updated so it doesn't cut in the middle of a word. */
      return text.substr( 0, length ) + ellipsis;
   },

   formatMs: function( msValue ) {
      var finalVal = '';
      //format number of seconds into MM:SS format
      initVar = msValue; // The initial data, in milliseconds
      milliVar = Math.floor( initVar / 1000 );
      minVar = Math.floor( milliVar / 60 ); // The minutes
      secVar = milliVar % 60; // The balance of seconds
      finalVal = minVar + ":" + secVar + ' min';
      return finalVal;
   }

};

