TV PROGRAM var doc = document;
var objectTag = "embed";
// detect browser type here
var isInternetExplorer = (-1 != navigator.userAgent.indexOf("MSIE"));
var isMozillaFirefox = (-1 != navigator.userAgent.indexOf("Firefox"));
var isGoogleChrome = (-1 != navigator.userAgent.indexOf("Chrome"));
var isAppleSafari = (-1 != navigator.userAgent.indexOf("Safari"));
// http://msdn.microsoft.com/en-us/library/ms537509(VS.85).aspx Detecting Internet Explorer More Effectively
function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
var rv = -1; // Return value assumes failure.
if (navigator.appName == 'Microsoft Internet Explorer')
{
var ua = navigator.userAgent;
var re = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
if (re.exec(ua) != null)
rv = parseFloat( RegExp.$1 );
}
return rv;
}
// universal cross-browser loader
if (isInternetExplorer)
{
// use tag for Internet Explorer
objectTag = "object";
// just execute script
ReplaceVideoElements();
}
else if (isMozillaFirefox)
{
// listen for the 'DOMContentLoaded' event and then execute script
function OnDOMContentLoadedHandled(e)
{
ReplaceVideoElements();
}
function OnDOMContentLoadedTabbedHandled(e)
{
doc = e.originalTarget;
if (doc instanceof HTMLDocument)
{
// is this an inner frame?
if (doc.defaultView.frameElement)
{
// frame within a tab was loaded, find the root document
while (doc.defaultView.frameElement)
doc = doc.defaultView.frameElement.ownerDocument;
}
}
ReplaceVideoElements();
}
if (gBrowser)
{
// Firefox 4 stuff for tabbed browsing
// https://developer.mozilla.org/en/Code_snippets/Tabbed_browser#Detecting_page_load
gBrowser.addEventListener("DOMContentLoaded", OnDOMContentLoadedTabbedHandled, false);
}
else
{
window.addEventListener("DOMContentLoaded", OnDOMContentLoadedHandled, false);
}
}
else if (isGoogleChrome)
{
// just execute script
ReplaceVideoElements();
}
else if (isAppleSafari)
{
// listen for the 'DOMContentLoaded' event and then execute script
function OnDOMContentLoadedHandled(e)
{
ReplaceVideoElements();
}
window.addEventListener("DOMContentLoaded", OnDOMContentLoadedHandled, false);
}
function MessageHandler(event)
{
//window.addEventListener("load", OnLoad, false);
}
// cross-browser wrapper for hasAttribute to support IE8 comaptibility view
function ElementHasAttribute(element, attribute)
{
if (isInternetExplorer)
{
var attribute = element.getAttribute(attribute);
return null != attribute;
}
else
{
return element.hasAttribute(attribute);
}
}
// replacing script
function ReplaceVideoElements()
{
// set up DOM events for Google Chrome & Mozilla Firefox
if (isMozillaFirefox || isGoogleChrome || isAppleSafari)
{
doc.addEventListener("DOMNodeInserted", onDOMNodeInserted, false);
doc.addEventListener("DOMNodeInsertedIntoDocument", onDOMNodeInsertedIntoDocument, false);
}
if (isInternetExplorer)
{
var ver = getInternetExplorerVersion();
if (ver >= 9.0)
{
doc.addEventListener("DOMNodeInserted", onDOMNodeInserted, false);
doc.addEventListener("DOMNodeInsertedIntoDocument", onDOMNodeInsertedIntoDocument, false);
}
else
{
// HACK : override appendChild, replaceChild, insertBefore for IE, since it doesn't support DOM events
var appendChildOriginal = doc.body.appendChild;
doc.body.appendChild = function(element)
{
appendChildOriginal(element);
if (null != element.tagName)
{
var tag = element.tagName.toLowerCase();
if ("video" == tag)
{
ProcessVideoElement(element);
}
}
}
var replaceChildOriginal = doc.body.replaceChild;
doc.body.replaceChild = function(element, reference)
{
replaceChildOriginal(element, reference);
if (null != element.tagName)
{
var tag = element.tagName.toLowerCase();
if ("video" == tag)
{
ProcessVideoElement(element);
}
}
}
var insertBeforeOriginal = doc.body.insertBefore;
doc.body.insertBefore = function(element, reference)
{
insertBeforeOriginal(element, reference);
if (null != element.tagName)
{
var tag = element.tagName.toLowerCase();
if ("video" == tag)
{
ProcessVideoElement(element);
}
}
}
}
}
var skip = 0;
for (;;)
{
// search the document for all elements
var elements = doc.getElementsByTagName("video");
if (skip == elements.length)
{
break;
}
var element = elements[skip];
if (!ProcessVideoElement(element))
{
++skip;
}
}
function onDOMNodeInserted(e)
{
if (null != e.target && null != e.target.tagName)
{
var tag = e.target.tagName.toLowerCase();
if ("video" == tag)
{
ProcessVideoElement(e.target);
}
}
}
function onDOMNodeInsertedIntoDocument(e)
{
if (null != e.target && null != e.target.tagName)
{
var tag = e.target.tagName.toLowerCase();
if ("video" == tag)
{
ProcessVideoElement(e.target);
}
}
}
function ProtocolIsSupported(src, doc)
{
// Check for proper portocol.
// If src has protocol specification and it is equal to
// "http:/" of "file:/" return true.
// If src hasn't protocol specification than check for it
// in doc.location.
var src_prtcl = src.substring(0, 6);
var doc_prtcl = doc.substring(0, 6);
if (src_prtcl == "http:/" || src_prtcl == "file:/")
{
return true;
}
else if (src.indexOf(":/") != -1)
{
return false;
}
else if (doc_prtcl == "http:/" || doc_prtcl == "file:/")
{
return true;
}
return false;
}
function ProcessVideoElement(element)
{
var divxelement;
var srcforcheck = "";
// resource selection algorithm
if (ElementHasAttribute(element, "src"))
{
// since we have only one source here, we don't need to check audio
if (IsSupportedResource(element, true, false))
{
divxelement = doc.createElement(objectTag);
CopyParameter(element, divxelement, "src");
CopyParameterEx(element, divxelement, "onerror", "onerrorcandidate");
}
else
{
return false;
}
srcforcheck = element.getAttribute("src");
}
else
{
// hack for IE - closed element has no "child"
if (isInternetExplorer && IsElementClosed(element))
{
// src attribute is missing, hovewer it can be set later by script, so try it
if (IsSupportedResource(element, true, false))
{
divxelement = doc.createElement(objectTag);
CopyParameter(element, divxelement, "src");
CopyParameterEx(element, divxelement, "onerror", "onerrorcandidate");
}
else
{
return false;
}
srcforcheck = element.getAttribute("src");
}
else
{
var childelement;
// first of all try to find that "probably" supported (should "codecs" field specified)
if ( null != (childelement = FindResource(element, false, true)))
{
divxelement = doc.createElement(objectTag);
CopyParameter (childelement, divxelement, "src");
CopyParameterEx(childelement, divxelement, "onerror", "onerrorcandidate");
srcforcheck = childelement.getAttribute("src");
}
// if there is no "probably" supported element, try to find "maybe" supported
else if (null != (childelement = FindResource(element, true, true)))
{
divxelement = doc.createElement(objectTag);
CopyParameter (childelement, divxelement, "src");
CopyParameterEx(childelement, divxelement, "onerror", "onerrorcandidate");
srcforcheck = childelement.getAttribute("src");
}
// if suitable element wasn't found, try to find w/ supported video, but unsupported audio
else if (null != (childelement = FindResource(element, true, false)))
{
divxelement = doc.createElement(objectTag);
CopyParameter (childelement, divxelement, "src");
CopyParameterEx(childelement, divxelement, "onerror", "onerrorcandidate");
srcforcheck = childelement.getAttribute("src");
}
else
{
// src attribute is missing, hovewer it can be set later by script, so try it
if (IsSupportedResource(element, true, false))
{
divxelement = doc.createElement(objectTag);
CopyParameter (element, divxelement, "src");
CopyParameterEx(element, divxelement, "onerror", "onerrorcandidate");
srcforcheck = element.getAttribute("src");
}
else
{
return false;
}
}
}
}
if (srcforcheck == null)
{
return false;
}
if (ProtocolIsSupported(srcforcheck, doc.location.href) != true)
{
return false;
}
CopyGlobalAttributes(element, divxelement);
CopyEvents(element, divxelement);
CopyParameterEx(element, divxelement, "poster", "previewImage");
CopyAttribute(element, divxelement, "width");
CopyAttribute(element, divxelement, "height");
// controls, autoplay & loop are boolean attributes
// http://www.w3.org/TR/html5/common-microsyntaxes.html#boolean-attribute
var controls = element.getAttribute("controls");
if (null == controls)
{
AddParameter(divxelement, "mode", "null");
}
var autoplay = element.getAttribute("autoplay");
if (null != autoplay)
{
AddParameter(divxelement, "autoplay", "true");
}
else
{
AddParameter(divxelement, "autoplay", "false");
}
var loop = element.getAttribute("loop");
if (null != loop)
{
AddParameter(divxelement, "loop", "true");
}
else
{
AddParameter(divxelement, "loop", "false");
}
// TODO : copy attribute preload (http://www.w3.org/TR/html5/video.html#attr-media-preload)
// hack for IE - remove "children" that really are siblings and will be visible w/out removing
var parent = element.parentNode;
if (isInternetExplorer && !IsElementClosed(element))
{
for (;;)
{
var nextelement = element.nextSibling;
if (null == nextelement)
{
break;
}
if (null == nextelement.tagName)
{
break;
}
var tag = nextelement.tagName.toLowerCase();
parent.removeChild(nextelement);
if ("/video" == tag)
{
break;
}
}
}
if (!isInternetExplorer)
{
divxelement.setAttribute("pluginspage", "http://go.divx.com/plugin/download/");
divxelement.setAttribute("type", "video/divx");
}
// NOTE : for IE do replacement as earlier than setting CLSID, otherwise SetClientSite has no IWebBrowser2 (as result JS won't work)
// NOTE : for Chrome do replacement after setting mime-type, overwise default handler will be loaded (e.g. QuickTime)
parent.replaceChild(divxelement, element);
if (isInternetExplorer)
{
divxelement.setAttribute("codebase", "http://go.divx.com/plugin/DivXBrowserPlugin.cab");
divxelement.setAttribute("classid", "clsid:67DABFBF-D0AB-41fa-9C46-CC0F21721616");
}
// FIXME : w/out it I hear ugly sounds
element.removeAttribute("src");
// HACK : supress Chrome's default and error handlers (won't generate redundant "onerror" events)
if (isGoogleChrome || isAppleSafari)
{
element.onerror = function() {};
var children = element.childNodes;
for (var i = 0; i < children.length; ++i)
{
if (null != children[i] && null != children[i].tagName && "source" == children[i].tagName.toLowerCase())
{
children[i].onerror = function() {};
}
}
}
return true;
}
function GetFileExtension(src)
{
var name, ext;
var slash = src.lastIndexOf("/");
var backslash = src.lastIndexOf("\\");
var pos = Math.max(slash, backslash);
name = -1 != pos ? src.substr(pos + 1, src.length) : "";
var dot = name.lastIndexOf(".");
ext = -1 != dot ? name.substr(dot + 1, src.length) : "";
return ext.toLowerCase();
}
function IsSupportedResource(element, maybe, checkaudio)
{
// check mime-type first
if (ElementHasAttribute(element, "type"))
{
var mime = element.getAttribute("type");
return IsSupportedMimeType(mime, maybe, checkaudio);
}
// if mime-type is missing, try check for extension
else if (ElementHasAttribute(element, "src"))
{
var src = element.getAttribute("src");
return IsSupportedExtension(src);
}
// no mime, no extension - wrong element
return false;
}
// looking for the suitable element
function FindResource(element, maybe, checkaudio)
{
var out = null;
if (isInternetExplorer)
{
// hack : walking siblings instead children
var nextelement = element.nextSibling;
for (;;)
{
if (null == nextelement)
{
return out;
}
var tag = nextelement.tagName.toLowerCase();
if ("/video" == tag)
{
return out;
}
if ("source" == tag)
{
if (IsSupportedResource(nextelement, maybe, checkaudio))
{
out = nextelement;
break;
}
}
nextelement = nextelement.nextSibling;
}
}
else
{
var children = element.childNodes;
for (var i = 0; i < children.length; ++i)
{
if (null != children[i] && null != children[i].tagName && "source" == children[i].tagName.toLowerCase())
{
if (IsSupportedResource(children[i], maybe, checkaudio))
{
out = children[i];
break;
}
}
}
}
return out;
}
function CopyGlobalAttributes(elementSrc, elementDst)
{
var globals =
[
// common
"class",
"contenteditable",
"contextmenu",
"dir",
"draggable",
"id",
"hidden",
"lang",
"style",
"spellcheck",
"tabindex",
"title",
// events
"onblur",
"onchange",
"onclick",
"oncontextmenu",
"ondblclick",
"ondrag",
"ondragend",
"ondragenter",
"ondragleave",
"ondragover",
"ondragstart",
"ondrop",
"onfocus",
"onkeydown",
"onkeypress",
"onkeyup",
"onmousedown",
"onmousemove",
"onmouseout",
"onmouseover",
"onmouseup",
"onmousewheel",
"onscroll",
"onselect",
"onsubmit"
];
for (var i = 0; i < globals.length; ++i)
{
CopyAttribute(elementSrc, elementDst, globals[i]);
}
}
function CopyEvents(elementSrc, elementDst)
{
var events =
[
"onloadstart",
"onprogress",
"onsuspend",
"onload",
"onabort",
"onerror",
"onloadend",
"onemptied",
"onstalled",
"onplay",
"onpause",
"onloadedmetadata",
"onloadeddata",
"onwaiting",
"onplaying",
"oncanplay",
"oncanplaythrough",
"onseeking",
"onseeked",
"ontimeupdate",
"onended",
"onratechange",
"ondurationchange",
"onvolumechange"
];
for (var i = 0; i < events.length; ++i)
{
CopyParameter(elementSrc, elementDst, events[i]);
}
}
function CopyAttributeEx(elementSrc, elementDst, nameSrc, nameDst)
{
var value = elementSrc.getAttribute(nameSrc);
if (null != value)
{
elementDst.setAttribute(nameDst, value);
}
}
function CopyAttribute(elementSrc, elementDst, name)
{
CopyAttributeEx(elementSrc, elementDst, name, name);
}
// stubs for support IE sub-elements
function AddParameter(element, name, value)
{
if (isInternetExplorer)
{
var paramelement = doc.createElement('param');
if (null != paramelement)
{
paramelement.setAttribute('name', name);
paramelement.setAttribute('value', value);
element.appendChild(paramelement);
}
}
else
{
// just set attribute
element.setAttribute(name, value);
}
}
function CopyParameterEx(elementSrc, elementDst, nameSrc, nameDst)
{
var value = elementSrc.getAttribute(nameSrc);
if (null != value)
{
AddParameter(elementDst, nameDst, value);
}
}
function CopyParameter(elementSrc, elementDst, name)
{
CopyParameterEx(elementSrc, elementDst, name, name);
}
// HACK : this is for detect is element closed (e.g. )
// necessity is IE (at least IE 6, 7, 8) doesn't recognize children of as children, but as siblings
function IsElementClosed(element)
{
var html = element.outerHTML;
return (html.length - 2) == html.lastIndexOf('/>');
}
function stripSpaces(str)
{
var spaces =
[
"\t", // horizontal tab
"\n", // new line
"\r", // carriage return
"\b", // backspace
"\f", // form feed
" ", // regular space
String.fromCharCode(11), // vertical tab
String.fromCharCode(160), // no-break space
String.fromCharCode(5760), // orgham space mark
String.fromCharCode(6158), // mongolian vowel separator (MVS)
String.fromCharCode(8194), // en space
String.fromCharCode(8195), // em space
String.fromCharCode(8196), // three-per-em space
String.fromCharCode(8197), // four-per-em space
String.fromCharCode(8198), // six-per-em space
String.fromCharCode(8199), // figure space
String.fromCharCode(8200), // punctuation space
String.fromCharCode(8201), // thin space
String.fromCharCode(8202), // hair space
String.fromCharCode(8203), // zero width space (ZWSP)
String.fromCharCode(8204), // zero width non joiner (ZWNJ)
String.fromCharCode(8205), // zero width joiner (ZWJ)
String.fromCharCode(8239), // narrow no-break space
String.fromCharCode(8194), // en space
String.fromCharCode(8287), // mediaum mathematical space (MMSP)
String.fromCharCode(8288), // word joiner general punctuation
String.fromCharCode(12288), // ideographic space
String.fromCharCode(65279) // zero width no-break space (BOM)
];
for (var i = 0; i < spaces.length; ++i)
{
str = str.split(spaces[i]).join("");
}
return str;
}
function IsSupportedMimeType(mime, maybe, checkaudio)
{
var mimetypes =
[
// divx
"video/divx",
// avi
"video/avi",
"video/msvideo",
"video/x-msvideo",
"video/vnd.avi",
// mkv
"video/x-matroska",
// mp4
"video/mp4",
// mov
"video/quicktime",
"video/x-quicktime",
// m4v
"video/m4v",
"video/x-m4v"
// currently not supported
// 3gp
// "video/3gpp",
// "video/3gpp2",
// flv
// "video/x-flv",
// mp4
// "application/mp4",
];
var videocodecs =
[
// generic for MPEG-4 Part 10 H.264/AVC
"avc1",
// MPEG-4 Part 10 H.264/AVC, Baseline Profile
"avc1.42e00a", // level 1.0
"avc1.42e00b", // level 1.1
"avc1.42e00c", // level 1.2
"avc1.42e00d", // level 1.3
"avc1.42e014", // level 2.0
"avc1.42e015", // level 2.1
"avc1.42e016", // level 2.2
"avc1.42e01e", // level 3.0
"avc1.42e01f", // level 3.1
"avc1.42e020", // level 3.2
"avc1.42e028", // level 4.0
// MPEG-4 Part 10 H.264/AVC, Main Profile
"avc1.4d400a", // level 1.0
"avc1.4d400b", // level 1.1
"avc1.4d400c", // level 1.2
"avc1.4d400d", // level 1.3
"avc1.4d4014", // level 2.0
"avc1.4d4015", // level 2.1
"avc1.4d4016", // level 2.2
"avc1.4d401e", // level 3.0
"avc1.4d401f", // level 3.1
"avc1.4d4020", // level 3.2
"avc1.4d4028", // level 4.0
// MPEG-4 Part 10 H.264/AVC, High Profile
"avc1.64000a", // level 1.0
"avc1.64000b", // level 1.1
"avc1.64000c", // level 1.2
"avc1.64000d", // level 1.3
"avc1.640014", // level 2.0
"avc1.640015", // level 2.1
"avc1.640016", // level 2.2
"avc1.64001e", // level 3.0
"avc1.64001f", // level 3.1
"avc1.640020", // level 3.2
"avc1.640028", // level 4.0
// MPEG-4 Part 2 Visual Simple Profile
"mp4v.20.9", // level 0
// MPEG-4 Part 2 Visual Advanced Simple Profile
"mp4v.20.240" // level 0
];
var audiocodecs =
[
// generic for MPEG-2 Part 7 & MPEG-4 Part 2 AAC
"mp4a",
// MPEG-2 Part 7 & MPEG-4 Part 2 AAC, Low-Complexity Profile
"mp4a.40.2"
];
// make mime-type lower case and remove all spaces first
var codecs = "codecs=";
var codecspart = "";
var videocodec = "";
var audiocodec = "";
var mimepart = mime.toLowerCase();
mimepart = stripSpaces(mimepart);
// extract real mime-type w/out any parameters
var pos = mimepart.indexOf(";");
if (-1 != pos)
{
var tail = mimepart.substr(pos + 1, mimepart.length);
mimepart = mimepart.substr(0, pos);
pos = tail.indexOf(codecs);
if (-1 != pos)
{
// remove quotes
codecspart = tail.substr(codecs.length + 1, tail.length - codecs.length - 2);
// split to the two parts
pos = codecspart.indexOf(',');
if (-1 != pos)
{
videocodec = codecspart.substr(0, pos);
audiocodec = codecspart.substr(pos + 1, codecspart.length);
}
else
{
videocodec = codecspart;
}
}
}
var found = false;
for (var i = 0; i < mimetypes.length; ++i)
{
if (mimepart == mimetypes[i])
{
found = true;
break;
}
}
if (!found)
{
return false;
}
if ("" != videocodec)
{
found = false;
for (var i = 0; i < videocodecs.length; ++i)
{
if (videocodec == videocodecs[i])
{
found = true;
break;
}
}
if (!found)
{
return false;
}
// check audio codec if present and if this check is necessary only
if ("" != audiocodec && checkaudio)
{
found = false;
for (var i = 0; i < audiocodecs.length; ++i)
{
if (audiocodec == audiocodecs[i])
{
found = true;
break;
}
}
if (!found)
{
return false;
}
}
}
else if (!maybe)
{
return false;
}
return true;
}
function IsSupportedExtension(src)
{
var extensions =
[
// divx
"divx",
"div",
// avi
"avi",
// mkv
"mkv",
// mp4
"mp4",
// mov
"mov",
"qt",
// m4v
"m4v",
// f4v
"f4v"
// currently not supported
/*
// ogg
"ogg",
"ogm",
"ogv",
// flv
"flv",
"fll",
// avc
"avc",
"264",
// 3gp
"3gp",
"3g2",
// f4v
"f4p",
*/
];
var ext = GetFileExtension(src);
for (var i = 0; i < extensions.length; ++i)
{
if (ext == extensions[i])
{
return true;
}
}
return false;
}
}
FILMOVI To view this video player/playlist you need to have Flash Player 9 or newer installed and JavaScript enabled. This video playlist was created with TubeSnack.
Ko je trenutno na forumu Imamo 1 korisnika na forumu: 0 Registrovanih, 0 Skrivenih i 1 Gost Nema Najviše korisnika na forumu ikad bilo je 8 dana Sub Avg 13, 2011 6:56 am