// Copyright (c) 2006 Industrial Video & Control Co. LLC. All rights reserved. var imagesLoaded = new Array(); var videoFreezedHashtable = {}; // hashtable for keep track a list of freezed video info var freeze = false; function displayViewLayout() { var errorMsg = checkViewLayoutParams(); if (errorMsg.length == 0) { var tableLayout = getViewLayout(); var viewPanelDivObj = document.getElementById("viewPanelDivObj"); viewPanelDivObj.innerHTML = tableLayout; if (freezeTimeout > 0) setTimeout("freezeVideo(this.document)", freezeTimeout); } else alert(errorMsg); } function getViewLayout() { //alert("rows: " + rows + " columns: " + columns + " order: " + order + " feeds: " + feeds); var tableLayout = ""; var feedIndex = 0; var orderUpper = order.toUpperCase(); for (var r = 0; r < rows; ++r) { if (orderUpper == "V") feedIndex = r; tableLayout += ""; for (var c = 0; c < columns; ++c) { var imageName = "image" + (r+1) + (c+1); tableLayout += ""; if (orderUpper == "H") feedIndex++; else feedIndex += columns; } tableLayout += ""; } tableLayout += "
"; var feedId = feeds[feedIndex]; var imageType = feedImageTypes[feedIndex]; if (feedId == null || imageType == null) tableLayout += getErrorImageCell(imageName); else { var fps = feedFps[feedIndex]; if (fps == null) fps = 1; if (imageType != 1 || useIvcAx) tableLayout += getIvcAxImageCell(feeds[feedIndex], imageName, fps); else tableLayout += getJpegImageCell(feeds[feedIndex], imageName, fps); } tableLayout += "
"; //alert(tableLayout); return tableLayout; } function getJpegImageCell(feedId, imageName, fps) { var cell = ""; if (feedId != null) { cell = ""; cell += ""; cell += ""; cell += ""; cell += ""; cell += ""; cell += ""; cell += ""; } return cell; } function getErrorImageCell(imageName) { var cell = ""; return cell; } function loadImage(image, feedId, fps) { if (image != null && feedId != null && feedId > 0) { if (freeze == false) { if (navigator.appName == "Netscape" && isImageLoaded(image.name) == false) image.onload = ""; var stillImage = (navigator.appName != "Netscape"); image.src = getImageSrc(feedId, fps, stillImage, true); window.status = "Receiving unlimited frames..."; if (isImageLoaded(image.name) == false) imagesLoaded[imagesLoaded.length] = image.name; } else if (navigator.appName == "Netscape") { var stillImageUrl = findStillImageUrl(image.name); image.src = stillImageUrl; } } } function getImageSrc(feedId, fps, stillImage, includeUniqueNumber) { // /video/// var frames = stillImage ? 1 : 0; var path = getRelayServerUrl() + "/video/" + feedId + "/" + frames + "/" + "fps=" + fps; if (includeUniqueNumber) path += "/" + (new Date()).getTime(); return path; } function getRelayServerUrl() { return (location.protocol + "//" + location.hostname + ((location.port != "") ? (":" + location.port) : "")); } function isImageLoaded(imageName) { var loaded = false; for (var i = 0; i < imagesLoaded.length; ++i) { if (imagesLoaded[i] == imageName) { loaded = true; break; } } return loaded; } function checkViewLayoutParams() { var errorMsg = ""; if (rows <= 0) errorMsg = "Number of rows: " + rows + " specified was invalid."; else if (columns <= 0) errorMsg = "Number of columns: " + columns + " specified was invalid."; else if (feeds == null) errorMsg = "No feeds were specified for the view."; else { var orderUpper = order.toUpperCase(); if (orderUpper != "V" && orderUpper != "H") errorMsg = "Order: " + order + " was invalid."; } return errorMsg; } function imageClicked(oImage, feedId, oEvent) { if (enablePtClk) { var pos = getObjectPos(oImage, oEvent); var x = pos[0]; var y = pos[1]; requestPointClick(feedId, imageWidth, imageHeight, x, y); } } function imageMouseMoved(oImage, oEvent) { oImage.style.cursor = getHandCursorName(); } function freezeVideo() { // save all the video info for (var i = 0; i < document.images.length; ++i) { var rsVideoUrlInfo = parseRsVideoUrl(document.images[i].src); videoFreezedHashtable[document.images[i].name] = rsVideoUrlInfo; } // set the freeze flag to notify the loadImage() callback to stop streaming freeze = true; } function unfreezeVideo() { // reset the video src path for (var imageName in videoFreezedHashtable) { var rsVideoUrlInfo = videoFreezedHashtable[imageName]; var imageIndex = findImageIndex(imageName); if (imageIndex >= 0) { var stillImage = (navigator.appName != "Netscape"); document.images[imageIndex].src = getImageSrc(rsVideoUrlInfo.feedId, rsVideoUrlInfo.fps, stillImage, true); } } // reset the freeze flag to notify the loadImage() callback to start streaming freeze = false; } function findImageIndex(imageName) { var index = -1; for (var i = 0; i < document.images.length; ++i) { if (document.images[i].name == imageName) { index = i; break; } } return index; } function findStillImageUrl(imageName) { var url = ""; for (var name in videoFreezedHashtable) { if (name == imageName) { var rsVideoUrlInfo = videoFreezedHashtable[name]; url = getImageSrc(rsVideoUrlInfo.feedId, rsVideoUrlInfo.fps, true, false); break; } } return url; } function parseRsVideoUrl(url) { var rsVideoUrlInfo = new Object(); var arr = url.split("//"); if (arr.length == 2) { var firstPart = arr[0]; var secondPart = arr[1]; rsVideoUrlInfo.protocol = firstPart.replace(":", ""); var arr2 = secondPart.split("/"); if (arr2.length == 6) { rsVideoUrlInfo.server = arr rsVideoUrlInfo.server = arr2[0]; rsVideoUrlInfo.command = arr2[1]; rsVideoUrlInfo.feedId = arr2[2]; rsVideoUrlInfo.frames = arr2[3]; rsVideoUrlInfo.fps = arr2[4].slice("fps=".length, arr2[4].length); rsVideoUrlInfo.uniqueNum = arr2[5]; } } return rsVideoUrlInfo; }