// global variables
var xmlDoc	
var todayXML
var typeOfLoad		// can be "today", "vid", "search", or "idList"

var clickedVidBlock = null	// number of block on screen currently clicked
var clickedVidId = null	// id number of vid currently clicked
var clickedVidTitle = null
var clickedVidImage = null
var clickedVidURL = null	// vid URL of vid currently clicked
var seriesTitle

var displayedArray = new Array()
var todayArray = new Array()
var fileListArray = new Array()
var seriesArray = new Array()
var favoriteArray = new Array()
var searchArray = new Array()
var searchEntry = new Array()

var totalHours = null
var loadDate
var dateString
var favoriteList 
var cookiesExpire = 60

var commonWordList = "the,and,where,how,into,was,were,are,from,which"
var commonWord = new Array()
commonWord = commonWordList.split(",")
var minWordLength = 2
var titleBonus = 1.5
var authorBonus = 2
var keywordBonus = 1

var shuffleShift = 0

function initialLoad() {
// set date variables for other functions
     loadDate = new Date()

     displayFavoritesNumber()
     turnAutoPlay(autoPlayMedia)

     if (location.search.search(/search=/i) >= 0 && unescape(location.search).length > 8) {
     typeOfLoad = "search"
     searchLoad()
     }

     else if (location.search.search(/id=/i) >= 0 && unescape(location.search).length > 4) {
     typeOfLoad = "idList"
     idListLoad()
     }

     else {
// load XML
     typeOfLoad = "todayDisplay"
     loadXML('today.xml')
     }

}

function vidLoad(block) {
     clickedVidBlock = block
     clickedVidId = displayedArray[block].id
     clickedVidTitle = displayedArray[block].title
     clickedVidImage = displayedArray[block].image

     vidFormat()
     typeOfLoad = "vid"
     loadXML("vids/vid"+clickedVidId+".xml")
}


function searchLoad() {
     var searchQuery
     var formattedQuery
     var sq_start
     var sq_end
     var tempParse = new Array()
     var tempParse2 = new Array()
     var tempParse3 = new Array()	// for formatting purposes only of formattedQuery
     var found

     searchQuery = unescape(location.search)
     sq_start = searchQuery.indexOf("search=") + 7
     sq_end = searchQuery.indexOf("&", sq_start)

     if (sq_end == -1) {
     sq_end = searchQuery.length
     }

     searchQuery = searchQuery.slice(sq_start, sq_end)

// display searchQuery in searchbox on screen
     tempParse3 = searchQuery.split('+')
     formattedQuery = ""
     for (k = 0; k < tempParse3.length; k++) {
     formattedQuery = formattedQuery + tempParse3[k]
     if (k < (tempParse3.length - 1)) {
     formattedQuery = formattedQuery + " "
     }
     }

     document.getElementById("searchbox").value=formattedQuery

// splits searchQuery into blocks based on quotation marks to keep whole phrases together
     tempParse = searchQuery.split('"')

     if (tempParse.length > 1) {
     searchQuery = ""

     for (i=0; i < tempParse.length; i++) {
     if (tempParse[i].indexOf("+") != 0 && tempParse[i].lastIndexOf("+") != (tempParse[i].length - 1)) {

     tempParse2 = tempParse[i].split('+')
     tempParse[i] = ""

// replaces + signs with spaces inside of quoted phrases only
          for (j=0; j < tempParse2.length; j++) {
               tempParse[i] = tempParse[i] + tempParse2[j]
               if (j < (tempParse2.length - 1)) {
               tempParse[i] = tempParse[i] + " "
          }
     }
     }

// reconstructs searchQuery with replacements
     searchQuery = searchQuery + tempParse[i]
     }
     }

     searchEntry = searchQuery.split('+')

// remove articles, short words, and common words from searchEntry
     for (i=0; i < searchEntry.length; i++) {
     j = 0
     found = false
          while (j < commonWord.length && found == false) {

          if (searchEntry[i].length <= minWordLength) {
          searchEntry.splice(i, 1)
          found = true
          i--
          }

          else if (searchEntry[i] == commonWord[j]) {
          searchEntry.splice(i, 1)
          found = true
          i--
          }

          j++
          }
     }

//alert(searchEntry.toString())

     loadXML("search.xml")
}


function idListLoad() {

     var searchQuery
     var sq_start
     var sq_end

     searchQuery = unescape(location.search)
     sq_start = searchQuery.indexOf("id=") + 3
     sq_end = searchQuery.indexOf("&", sq_start)

     if (sq_end == -1) {
     sq_end = searchQuery.length
     }

     searchQuery = searchQuery.slice(sq_start, sq_end)
     searchEntry = searchQuery.split(',')

     loadXML("search.xml")
}


/* loadXML function adapted from example at from w3schools.com */
function loadXML(xmlURL)

{
/* START OLD CODE
     //load xml file
     // code for IE
     if (window.ActiveXObject)
     {
	xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
	xmlDoc.async=false;
	xmlDoc.load(xmlURL);

	afterLoadXML()

     }
     // code for Mozilla, etc.
     else if (document.implementation && document.implementation.createDocument)
     {
	xmlDoc= document.implementation.createDocument("","",null);
	xmlDoc.load(xmlURL);

	xmlDoc.onload=afterLoadXML
     }
     else
     {
	alert('Your browser cannot handle this script');
     }
END OLD CODE */

/* START NEW CODE FOR SAFARI */
// code for Mozilla, etc.
if (window.XMLHttpRequest)
  {
  xmlDoc=new XMLHttpRequest()
  xmlDoc.onreadystatechange=state_Change
  xmlDoc.open("GET",xmlURL,true)
  xmlDoc.send(null)
  }
// code for IE
else if (window.ActiveXObject)
  {
  xmlDoc=new ActiveXObject("Microsoft.XMLHTTP")
    if (xmlDoc)
    {
    xmlDoc.onreadystatechange=state_Change
    xmlDoc.open("GET",xmlURL,true)
    xmlDoc.send()
    }
  }
/* END NEW CODE FOR SAFARI */

}


function state_Change()
{
// if xmlDoc shows "loaded"
if (xmlDoc.readyState==4)
  {
  // if "OK"
  if (xmlDoc.status==200)
  {
//  alert("XML data OK")

afterLoadXML()

  }
  else
  {
  alert("Problem retrieving XML data:" + xmlDoc.statusText)
  }
  }
}



function afterLoadXML() {

// variables for "today"
     var vidsListed

// variables for "todayFavorites"
     var favoriteIdArray = new Array()
     var lengthDiff

// variables for "vid"
     var tempDateString
     var mostRecentFile = null


if (typeOfLoad == "today" || typeOfLoad == "todayDisplay" || typeOfLoad == "todayFavorites") {

     todayXML = xmlDoc

     totalHours = todayXML.responseXML.getElementsByTagName("total")[0].firstChild.nodeValue

// put todayXML into todayArray

     vidsListed = todayXML.responseXML.getElementsByTagName("vid").length

     for (i=0; i<vidsListed; i++) 
     {
     todayArray[i] = new vidInfo()
     todayArray[i].id = todayXML.responseXML.getElementsByTagName("vid")[i].getAttribute("id")
     todayArray[i].title = todayXML.responseXML.getElementsByTagName("t")[i].firstChild.nodeValue
     todayArray[i].image = 'imgs/' + todayXML.responseXML.getElementsByTagName("i")[i].firstChild.nodeValue
     todayArray[i].priority = todayXML.responseXML.getElementsByTagName("vid")[i].parentNode.getAttribute("priority")
     }

     todayArray = randomSortArray(todayArray)

// display on page

     if (typeOfLoad == "todayDisplay") {
     displayArray(todayArray)
     }

     if (typeOfLoad == "todayFavorites") {
     favoriteIdArray = favoriteList.split(",")

// shows favorites in reverse order so most recently added is first
     favoriteIdArray = favoriteIdArray.reverse()

// fills favorites info into array based on id number
     for (i=0; i<favoriteIdArray.length; i++) {
          for (j=0; j<todayArray.length; j++) {

               if (favoriteIdArray[i] == todayArray[j].id) {
               favoriteArray[i] = new vidInfo()
               favoriteArray[i].id = todayArray[j].id
               favoriteArray[i].title = todayArray[j].title
               favoriteArray[i].image = todayArray[j].image

               }
          }
     }

// remove excess entries from favoriteArray once removed
     if (favoriteArray.length > favoriteIdArray.length) {
     lengthDiff = favoriteArray.length - favoriteIdArray.length
     favoriteArray.splice(favoriteIdArray.length, lengthDiff)
     }

//     displayedArray = favoriteArray
     displayArray(favoriteArray)

     }

}

if (typeOfLoad == "vid") {

     mostRecentFile = null
     clickedVidURL = null

// fill in details in array
     displayedArray[clickedVidBlock].title = xmlDoc.responseXML.getElementsByTagName("title")[0].firstChild.nodeValue
     displayedArray[clickedVidBlock].author = xmlDoc.responseXML.getElementsByTagName("author")[0].firstChild.nodeValue
     displayedArray[clickedVidBlock].website = xmlDoc.responseXML.getElementsByTagName("website")[0].firstChild.nodeValue
     displayedArray[clickedVidBlock].runtime = xmlDoc.responseXML.getElementsByTagName("runtime")[0].firstChild.nodeValue
     displayedArray[clickedVidBlock].rating = xmlDoc.responseXML.getElementsByTagName("rating")[0].firstChild.nodeValue
     displayedArray[clickedVidBlock].genre = xmlDoc.responseXML.getElementsByTagName("genre")[0].firstChild.nodeValue
     displayedArray[clickedVidBlock].language = xmlDoc.responseXML.getElementsByTagName("language")[0].firstChild.nodeValue
     displayedArray[clickedVidBlock].review = xmlDoc.responseXML.getElementsByTagName("review")[0].firstChild.nodeValue
     displayedArray[clickedVidBlock].description = xmlDoc.responseXML.getElementsByTagName("description")[0].firstChild.nodeValue

// set clickedVidURL to <preview> tag file
     clickedVidURL = xmlDoc.responseXML.getElementsByTagName("preview")[0].firstChild.nodeValue

// clear fileListArray
     fileListArray = new Array()

// get file dates
     for (i=0; i<xmlDoc.responseXML.getElementsByTagName("file").length; i++)
     {
     fileListArray[i] = new fileInfo()
     fileListArray[i].pubDate = new Date()

// parse file date
     tempDateString = xmlDoc.responseXML.getElementsByTagName("file")[i].getAttribute("date")

     fileListArray[i].pubDate.setFullYear(tempDateString.slice(6,10),(tempDateString.slice(0,2)-1),tempDateString.slice(3,5))
     fileListArray[i].fileURL = xmlDoc.responseXML.getElementsByTagName("file")[i].firstChild.nodeValue
     fileListArray[i].quality = xmlDoc.responseXML.getElementsByTagName("file")[i].getAttribute("quality")
     fileListArray[i].size = xmlDoc.responseXML.getElementsByTagName("file")[i].getAttribute("size")
     fileListArray[i].type = xmlDoc.responseXML.getElementsByTagName("file")[i].getAttribute("type")

     }

     displayDetails()

}

if (typeOfLoad == "search" || typeOfLoad == "idList") {

// put xmlDoc into searchArray

     vidsListed = xmlDoc.responseXML.getElementsByTagName("vid").length

     for (i=0; i<vidsListed; i++) 
     {
     searchArray[i] = new vidInfo()
     searchArray[i].id = xmlDoc.responseXML.getElementsByTagName("vid")[i].getAttribute("id")
     searchArray[i].title = xmlDoc.responseXML.getElementsByTagName("t")[i].firstChild.nodeValue
     searchArray[i].author = xmlDoc.responseXML.getElementsByTagName("a")[i].firstChild.nodeValue
     searchArray[i].image = 'imgs/' + xmlDoc.responseXML.getElementsByTagName("i")[i].firstChild.nodeValue
     searchArray[i].keywords = xmlDoc.responseXML.getElementsByTagName("k")[i].firstChild.nodeValue
     searchArray[i].priority = 0
     }

     if (typeOfLoad == "search") {
// give priority based on searchEntry

     for (i = 0; i < searchArray.length; i++) {
          for (j = 0; j < searchEntry.length; j++) {

          if (searchArray[i].title.toLowerCase().indexOf(searchEntry[j].toLowerCase()) >= 0) {
          searchArray[i].priority = searchArray[i].priority + titleBonus
          }
          if (searchArray[i].author.toLowerCase().indexOf(searchEntry[j].toLowerCase()) >= 0) {
          searchArray[i].priority = searchArray[i].priority + authorBonus
          }
          if (searchArray[i].keywords.toLowerCase().indexOf(searchEntry[j].toLowerCase()) >= 0) {
          searchArray[i].priority = searchArray[i].priority + keywordBonus
          }

          }
     }
     }

     if (typeOfLoad == "idList") {
     for (j = 0; j < searchEntry.length; j++) {
          for (i = 0; i < searchArray.length; i++) {
          if (searchArray[i].id == searchEntry[j]) {
          searchArray[i].priority = 1
          }
          }
     }

     for (i=0; i<searchArray.length; i++)
     {
     if (searchArray[i].priority == 0) {
     searchArray.splice(i, 1)
     i--
     }
     }

     }

// display on page

     searchArray = randomSortArray(searchArray)
     displayArray(searchArray)

     if (typeOfLoad == "idList" && searchArray.length > 0) {
     vidLoad(0)
     }

     if (searchArray.length == 0) {
     displayError("Your search returned no results.<br /><a>Click here to return.</a>")
     }
}

}


function randomSortArray(vidArray) {
     var sortedArray = new Array()
     var sortedTempArray = new Array()

// remove entries with 0 priority

     for (i=0; i<vidArray.length; i++)
     {
     if (vidArray[i].priority == 0) {
     vidArray.splice(i, 1)
     i--
     }
     }

// sort randomly with priority
// first, create a randomly ordered list of numbers up to todayArray.length

     for (i=0; i<vidArray.length; i++) {
     sortedArray[i] = i
     }
     sortedArray = sortedArray.sort(sortNumber)

// second, reorganize vidArray into order of sortedArray

     for (i=0; i<vidArray.length; i++) {
     sortedTempArray[i] = vidArray[sortedArray[i]]
     }
     vidArray = sortedTempArray


// third, adjust for priority

     for (i=0; i<vidArray.length; i++)
     {
     sortedTempArray.splice(Math.ceil(i * (1 - ( (vidArray[i].priority-1) / vidArray[i].priority))), 0, vidArray[i])
     sortedTempArray.splice(i+1, 1)
     }

return sortedTempArray
}


function shuffleOrder(direction) {

     var displayingToday = null

// shifts displayedArray forwards or backwards by totalBlocks and then displays result

     if (displayedArray == todayArray) {
     displayingToday = true
     }

     if (direction == "next") {
     displayedArray = (displayedArray.slice(totalBlocks,displayedArray.length)).concat(displayedArray.slice(0,totalBlocks))
     if (displayingToday == true) {shuffleShift++}
     }

     if (direction == "back") {
     displayedArray = (displayedArray.slice(displayedArray.length-totalBlocks,displayedArray.length)).concat(displayedArray.slice(0,displayedArray.length-totalBlocks))
     if (displayingToday == true) {shuffleShift--}
     }

     if (displayingToday == true) {
     todayArray = displayedArray
     }

     displayArray(displayedArray)

}


function viewSeries() {

     seriesTitle = clickedVidTitle
     seriesArray.splice(0, seriesArray.length)

     for (i=0; i<fileListArray.length; i++)
     {
     if (fileListArray[i].pubDate < loadDate) {

     seriesArray[i] = new vidInfo()

     seriesArray[i].title = fileListArray[i].pubDate.getMonth() + "/" + fileListArray[i].pubDate.getDate() + "/" + loadDate.getFullYear()
     seriesArray[i].image = clickedVidImage
     seriesArray[i].id = clickedVidId
     }

     }

sortArray(seriesArray, "title", true)

// display series
     changeView('favorites',false)
     changeView('series',true)
     displayArray(seriesArray)

}


function returnToToday() {

//     displayedArray = todayArray
     if ((location.search.search(/search=/i) >= 0 && unescape(location.search).length > 8) || (location.search.search(/id=/i) >= 0 && unescape(location.search).length > 4)) {

     document.location.search = ""
     }
     else {
     changeView('favorites',false)
     changeView('series',false)
     displayArray(todayArray)
     }

}


function clickLoadFavorites() {

     loadFavorites()
// include formatting changes when in favorites view
     if (!(favoriteList == null || favoriteList == "") && !((location.search.search(/search=/i) >= 0 && unescape(location.search).length > 8) || (location.search.search(/id=/i) >= 0 && unescape(location.search).length > 4))) {
     changeView('favorites',true)
     changeView('series',false)
     }

}


function loadFavorites() {
     var favoriteIdArray = new Array()
     var lengthDiff
     favoriteList = getCookie("favorites")

     if (favoriteList == null || favoriteList == "") {
// error message if no favorites are stored
//     alert("No Favorites")
     displayError("You have not selected any bookmarks.<br /><a>Click here to return.</a>")
//     returnToToday()
     }
     else {

     if ((location.search.search(/search=/i) >= 0 && unescape(location.search).length > 8) || (location.search.search(/id=/i) >= 0 && unescape(location.search).length > 4)) {
     typeOfLoad = "todayFavorites"
     loadXML('today.xml')
     }
     else {
     favoriteIdArray = favoriteList.split(",")

// shows favorites in reverse order so most recently added is first
     favoriteIdArray = favoriteIdArray.reverse()

// fills favorites info into array based on id number
     for (i=0; i<favoriteIdArray.length; i++) {
          for (j=0; j<todayArray.length; j++) {

               if (favoriteIdArray[i] == todayArray[j].id) {
               favoriteArray[i] = new vidInfo()
               favoriteArray[i].id = todayArray[j].id
               favoriteArray[i].title = todayArray[j].title
               favoriteArray[i].image = todayArray[j].image

               }
          }
     }

// remove excess entries from favoriteArray once removed
     if (favoriteArray.length > favoriteIdArray.length) {
     lengthDiff = favoriteArray.length - favoriteIdArray.length
     favoriteArray.splice(favoriteIdArray.length, lengthDiff)
     }

     currentlySelected = null
     displayArray(favoriteArray)
     }
     }
}


function getCookie(c_name)
{

     if (document.cookie.length>0)
     {
     c_start=document.cookie.indexOf(c_name + "=")
     if (c_start!=-1)
     { 
     c_start=c_start + c_name.length+1 
     c_end=document.cookie.indexOf(";",c_start)
     if (c_end==-1) c_end=document.cookie.length
     return unescape(document.cookie.substring(c_start,c_end))
     } 
     }
     return null

}


function clearCookie(c_name) {

     var exdate=new Date()
     exdate.setDate(cookiesExpire)
     document.cookie=c_name+"=;expires="+exdate
     displayFavoritesNumber()
}


function addCookie(c_name) {

     var exdate=new Date()
     exdate.setDate(cookiesExpire)
     var alreadyAdded
     var clickedId = clickedVidId //displayedArray[clickedVidBlock].id
     var idArray = new Array()

     if (getCookie(c_name) == null || getCookie(c_name) == "") {
     document.cookie=c_name+"="+clickedId+";expires="+exdate
     }

     else {
     alreadyAdded = false
     idArray = getCookie(c_name).split(",")
     for (i=0; i<idArray.length; i++) {
          if (clickedId == idArray[i]) {
          alreadyAdded = true
          }
     }

     if (!alreadyAdded) {
     document.cookie=c_name+"="+getCookie(c_name)+","+clickedId+";expires="+exdate
     }
     }
     displayFavoritesNumber()
}


function removeCookie(c_name) {

     var exdate=new Date()
     exdate.setDate(cookiesExpire)
     var clickedId = displayedArray[clickedVidBlock].id
     var idArray = new Array()

     if (getCookie(c_name) != null && getCookie(c_name) != "") {

     idArray = getCookie(c_name).split(",")

     for (i=0; i<idArray.length; i++) {
     if (clickedId == idArray[i]) {
     idArray.splice(i,1)
     }
     }

     document.cookie=c_name+"="+idArray.toString()+";expires="+exdate

     currentlySelected = null

     if (c_name == "favorites") {
     clickLoadFavorites()
     }

     }
     displayFavoritesNumber()
}


function sortArray(vidArray, infoCategory, desc) {

     var storeInfo = new vidInfo()

     if (infoCategory == "title") {

// bubble sort adapted from http://www.the-art-of-web.com/javascript/bubblesort/

     for(j=vidArray.length-1; j > 0; j--) {
     for(i=0; i < j; i++) { 

          if(compare(vidArray[i+1].title, vidArray[i].title, desc)) {
// exchange i with i+1
          storeInfo = vidArray[i]
          vidArray.splice(i, 1)
          vidArray.splice(i+1, 0, storeInfo)
          }
     } 
     }

     }

     return vidArray
}


function compare(val1, val2, desc) {
     return (desc) ? val1 > val2 : val1 < val2
}


function vidInfo(id, title, author, image, website, review, keywords, priority, runtime, rating, genre, language, description) {

     this.id = id
     this.title = title
     this.author = author
     this.image = image
     this.website = website
     this.review = review
     this.keywords = keywords
     this.priority = priority
     this.runtime = runtime
     this.rating = rating
     this.genre = genre
     this.language = language
     this.description = description

}


function fileInfo(pubDate, fileURL, quality, size, type) {

     this.pubDate = pubDate
     this.fileURL = fileURL
     this.quality = quality
     this.size = size
     this.type = type

}

function sortNumber(a, b)
{
     if (Math.round(Math.random())==1) {
     return b - a
     }
     else {
     return a - b
     }
}