
if (typeof ($v) == "undefined") {
    var $v = {};
};

var JSON; if (!JSON) { JSON = {}; } (function () { "use strict"; function f(n) { return n < 10 ? '0' + n : n; } if (typeof Date.prototype.toJSON !== 'function') { Date.prototype.toJSON = function (key) { return isFinite(this.valueOf()) ? this.getUTCFullYear() + '-' + f(this.getUTCMonth() + 1) + '-' + f(this.getUTCDate()) + 'T' + f(this.getUTCHours()) + ':' + f(this.getUTCMinutes()) + ':' + f(this.getUTCSeconds()) + 'Z' : null; }; String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function (key) { return this.valueOf(); }; } var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, gap, indent, meta = { '\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"': '\\"', '\\': '\\\\' }, rep; function quote(string) { escapable.lastIndex = 0; return escapable.test(string) ? '"' + string.replace(escapable, function (a) { var c = meta[a]; return typeof c === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }) + '"' : '"' + string + '"'; } function str(key, holder) { var i, k, v, length, mind = gap, partial, value = holder[key]; if (value && typeof value === 'object' && typeof value.toJSON === 'function') { value = value.toJSON(key); } if (typeof rep === 'function') { value = rep.call(holder, key, value); } switch (typeof value) { case 'string': return quote(value); case 'number': return isFinite(value) ? String(value) : 'null'; case 'boolean': case 'null': return String(value); case 'object': if (!value) { return 'null'; } gap += indent; partial = []; if (Object.prototype.toString.apply(value) === '[object Array]') { length = value.length; for (i = 0; i < length; i += 1) { partial[i] = str(i, value) || 'null'; } v = partial.length === 0 ? '[]' : gap ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : '[' + partial.join(',') + ']'; gap = mind; return v; } if (rep && typeof rep === 'object') { length = rep.length; for (i = 0; i < length; i += 1) { if (typeof rep[i] === 'string') { k = rep[i]; v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } else { for (k in value) { if (Object.prototype.hasOwnProperty.call(value, k)) { v = str(k, value); if (v) { partial.push(quote(k) + (gap ? ': ' : ':') + v); } } } } v = partial.length === 0 ? '{}' : gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : '{' + partial.join(',') + '}'; gap = mind; return v; } } if (typeof JSON.stringify !== 'function') { JSON.stringify = function (value, replacer, space) { var i; gap = ''; indent = ''; if (typeof space === 'number') { for (i = 0; i < space; i += 1) { indent += ' '; } } else if (typeof space === 'string') { indent = space; } rep = replacer; if (replacer && typeof replacer !== 'function' && (typeof replacer !== 'object' || typeof replacer.length !== 'number')) { throw new Error('json.stringify'); } return str('', { '': value }); }; } if (typeof JSON.parse !== 'function') { JSON.parse = function (text, reviver) { var j; function walk(holder, key) { var k, v, value = holder[key]; if (value && typeof value === 'object') { for (k in value) { if (Object.prototype.hasOwnProperty.call(value, k)) { v = walk(value, k); if (v !== undefined) { value[k] = v; } else { delete value[k]; } } } } return reviver.call(holder, key, value); } text = String(text); cx.lastIndex = 0; if (cx.test(text)) { text = text.replace(cx, function (a) { return '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); }); } if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { j = eval('(' + text + ')'); return typeof reviver === 'function' ? walk({ '': j }, '') : j; } throw new SyntaxError('json.parse'); }; } } ());

$v = (function () {
    var url = 'http://loader.vioapi.com', err = "undefined", empty = '', aid, sid, host, type = 'embed', cs,
    def = function (param) { return (typeof (param) != err && param != null); },
    encoder = function (s) { return encodeURIComponent(s); },
    decoder = function (s) { return decodeURIComponent(s); },
    d = function () { if (def($v.cookie)) return $v.cookie.get('_vd') != empty; return false; },
    log = function (msg) { if (typeof (console) !== 'undefined' && console != null && d()) { console.log(msg); } },
    identify = function () {
        host = window.location.host;
        var scripts = document.getElementsByTagName('script');
        var rx = new RegExp(url + "/js/([A-Za-z0-9-]+)/(\\w+).js");
        for (var i = 0; i < scripts.length; i++) {
            var value = rx.exec(scripts[i].src);
            if (value != null && value.length == 3) {
                var t = value[2];
                if (t == 'api') {
                    type = 'portal'; aid = value[1]; sid = value[1];
                } else {
                    sid = 'embed'; 
                    if (def($v.session)) { $v.context("vid", value[1]); };
                };
            }
        }
    } (),
    getMeta = function () {
        var m = $v.session.get('m');
        return (def(m) && m != empty) ? JSON.parse(m) : {};
    },
    meta = function (key, value) {
        var m = getMeta();
        if (def(key)) {
            m[key] = value;
            $v.session.set('m', JSON.stringify(m));
            if (def(cs)) { window.clearTimeout(cs); }
            cs = setTimeout(function () {
                var context = $v.context(), q = '', m = getMeta();
                for (var key in m) { q += key + "=" + m[key] + "&"; }
                $v.stat.send(url + '/t/bsc/' + context.sid + '/' + context.bid + '/' + context.si + '?' + q);
            }, 1000);
        };
        return m;
    },
    context = function (key, value) {
        var bid = (def($v.browser)) ? $v.browser.id() : empty;
        var si = (def($v.session)) ? $v.session.get("id") : empty;
        var m = meta(key, value);
        return { aid: aid, sid: sid, bid: bid, si: si, host: host, type: type, m: m };
    },
    init = function (opt) {
        aid = (aid == empty) ? opt.aid : aid;
        sid = (sid == empty) ? opt.sid : sid;
        $v.browser.id(opt);
    };
    return {
        init: function(opt) { init(opt); },
        log: function(text) { log(text); },
        def: function(param) { return def(param) },
        encoder: function(s) { return encoder(s); },
        decoder: function(s) { return decoder(s); },
        url: function(s) { return url + (s || ''); },
        context: function(key, value) { return context(key, value); },
        isEmbed: function() { return type == 'embed'; }
    };
})();

$v.jsonp = function (id, url, inline) {
    var url = $v.decoder(url);
    var sc = document.createElement("script");
    sc.setAttribute("id", id);
    sc.setAttribute("src", url);
    sc.setAttribute("type", "text/javascript"); 
    if (inline) {
         document.write('<script id="' + id + '" src="', url, '" type="text/JavaScript"><\/script>');
    } else {
         document.body.appendChild(sc);
    }
};

$v.swfobject = function () { var D = "undefined", r = "object", S = "Shockwave Flash", W = "ShockwaveFlash.ShockwaveFlash", q = "application/x-shockwave-flash", R = "SWFObjectExprInst", x = "onreadystatechange", O = window, j = document, t = navigator, T = false, U = [h], o = [], N = [], I = [], l, Q, E, B, J = false, a = false, n, G, m = true, M = function () { var aa = typeof j.getElementById != D && typeof j.getElementsByTagName != D && typeof j.createElement != D, ah = t.userAgent.toLowerCase(), Y = t.platform.toLowerCase(), ae = Y ? /win/.test(Y) : /win/.test(ah), ac = Y ? /mac/.test(Y) : /mac/.test(ah), af = /webkit/.test(ah) ? parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/, "$1")) : false, X = ! +"\v1", ag = [0, 0, 0], ab = null; if (typeof t.plugins != D && typeof t.plugins[S] == r) { ab = t.plugins[S].description; if (ab && !(typeof t.mimeTypes != D && t.mimeTypes[q] && !t.mimeTypes[q].enabledPlugin)) { T = true; X = false; ab = ab.replace(/^.*\s+(\S+\s+\S+$)/, "$1"); ag[0] = parseInt(ab.replace(/^(.*)\..*$/, "$1"), 10); ag[1] = parseInt(ab.replace(/^.*\.(.*)\s.*$/, "$1"), 10); ag[2] = /[a-zA-Z]/.test(ab) ? parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/, "$1"), 10) : 0 } } else { if (typeof O.ActiveXObject != D) { try { var ad = new ActiveXObject(W); if (ad) { ab = ad.GetVariable("$version"); if (ab) { X = true; ab = ab.split(" ")[1].split(","); ag = [parseInt(ab[0], 10), parseInt(ab[1], 10), parseInt(ab[2], 10)] } } } catch (Z) { } } } return { w3: aa, pv: ag, wk: af, ie: X, win: ae, mac: ac} } (), k = function () { if (!M.w3) { return } if ((typeof j.readyState != D && j.readyState == "complete") || (typeof j.readyState == D && (j.getElementsByTagName("body")[0] || j.body))) { f() } if (!J) { if (typeof j.addEventListener != D) { j.addEventListener("DOMContentLoaded", f, false) } if (M.ie && M.win) { j.attachEvent(x, function () { if (j.readyState == "complete") { j.detachEvent(x, arguments.callee); f() } }); if (O == top) { (function () { if (J) { return } try { j.documentElement.doScroll("left") } catch (X) { setTimeout(arguments.callee, 0); return } f() })() } } if (M.wk) { (function () { if (J) { return } if (!/loaded|complete/.test(j.readyState)) { setTimeout(arguments.callee, 0); return } f() })() } s(f) } } (); function f() { if (J) { return } try { var Z = j.getElementsByTagName("body")[0].appendChild(C("span")); Z.parentNode.removeChild(Z) } catch (aa) { return } J = true; var X = U.length; for (var Y = 0; Y < X; Y++) { U[Y]() } } function K(X) { if (J) { X() } else { U[U.length] = X } } function s(Y) { if (typeof O.addEventListener != D) { O.addEventListener("load", Y, false) } else { if (typeof j.addEventListener != D) { j.addEventListener("load", Y, false) } else { if (typeof O.attachEvent != D) { i(O, "onload", Y) } else { if (typeof O.onload == "function") { var X = O.onload; O.onload = function () { X(); Y() } } else { O.onload = Y } } } } } function h() { if (T) { V() } else { H() } } function V() { var X = j.getElementsByTagName("body")[0]; var aa = C(r); aa.setAttribute("type", q); var Z = X.appendChild(aa); if (Z) { var Y = 0; (function () { if (typeof Z.GetVariable != D) { var ab = Z.GetVariable("$version"); if (ab) { ab = ab.split(" ")[1].split(","); M.pv = [parseInt(ab[0], 10), parseInt(ab[1], 10), parseInt(ab[2], 10)] } } else { if (Y < 10) { Y++; setTimeout(arguments.callee, 10); return } } X.removeChild(aa); Z = null; H() })() } else { H() } } function H() { var ag = o.length; if (ag > 0) { for (var af = 0; af < ag; af++) { var Y = o[af].id; var ab = o[af].callbackFn; var aa = { success: false, id: Y }; if (M.pv[0] > 0) { var ae = c(Y); if (ae) { if (F(o[af].swfVersion) && !(M.wk && M.wk < 312)) { w(Y, true); if (ab) { aa.success = true; aa.ref = z(Y); ab(aa) } } else { if (o[af].expressInstall && A()) { var ai = {}; ai.data = o[af].expressInstall; ai.width = ae.getAttribute("width") || "0"; ai.height = ae.getAttribute("height") || "0"; if (ae.getAttribute("class")) { ai.styleclass = ae.getAttribute("class") } if (ae.getAttribute("align")) { ai.align = ae.getAttribute("align") } var ah = {}; var X = ae.getElementsByTagName("param"); var ac = X.length; for (var ad = 0; ad < ac; ad++) { if (X[ad].getAttribute("name").toLowerCase() != "movie") { ah[X[ad].getAttribute("name")] = X[ad].getAttribute("value") } } P(ai, ah, Y, ab) } else { p(ae); if (ab) { ab(aa) } } } } } else { w(Y, true); if (ab) { var Z = z(Y); if (Z && typeof Z.SetVariable != D) { aa.success = true; aa.ref = Z } ab(aa) } } } } } function z(aa) { var X = null; var Y = c(aa); if (Y && Y.nodeName == "OBJECT") { if (typeof Y.SetVariable != D) { X = Y } else { var Z = Y.getElementsByTagName(r)[0]; if (Z) { X = Z } } } return X } function A() { return !a && F("6.0.65") && (M.win || M.mac) && !(M.wk && M.wk < 312) } function P(aa, ab, X, Z) { a = true; E = Z || null; B = { success: false, id: X }; var ae = c(X); if (ae) { if (ae.nodeName == "OBJECT") { l = g(ae); Q = null } else { l = ae; Q = X } aa.id = R; if (typeof aa.width == D || (!/%$/.test(aa.width) && parseInt(aa.width, 10) < 310)) { aa.width = "310" } if (typeof aa.height == D || (!/%$/.test(aa.height) && parseInt(aa.height, 10) < 137)) { aa.height = "137" } j.title = j.title.slice(0, 47) + " - Flash Player Installation"; var ad = M.ie && M.win ? "ActiveX" : "PlugIn", ac = "MMredirectURL=" + O.location.toString().replace(/&/g, "%26") + "&MMplayerType=" + ad + "&MMdoctitle=" + j.title; if (typeof ab.flashvars != D) { ab.flashvars += "&" + ac } else { ab.flashvars = ac } if (M.ie && M.win && ae.readyState != 4) { var Y = C("div"); X += "SWFObjectNew"; Y.setAttribute("id", X); ae.parentNode.insertBefore(Y, ae); ae.style.display = "none"; (function () { if (ae.readyState == 4) { ae.parentNode.removeChild(ae) } else { setTimeout(arguments.callee, 10) } })() } u(aa, ab, X) } } function p(Y) { if (M.ie && M.win && Y.readyState != 4) { var X = C("div"); Y.parentNode.insertBefore(X, Y); X.parentNode.replaceChild(g(Y), X); Y.style.display = "none"; (function () { if (Y.readyState == 4) { Y.parentNode.removeChild(Y) } else { setTimeout(arguments.callee, 10) } })() } else { Y.parentNode.replaceChild(g(Y), Y) } } function g(ab) { var aa = C("div"); if (M.win && M.ie) { aa.innerHTML = ab.innerHTML } else { var Y = ab.getElementsByTagName(r)[0]; if (Y) { var ad = Y.childNodes; if (ad) { var X = ad.length; for (var Z = 0; Z < X; Z++) { if (!(ad[Z].nodeType == 1 && ad[Z].nodeName == "PARAM") && !(ad[Z].nodeType == 8)) { aa.appendChild(ad[Z].cloneNode(true)) } } } } } return aa } function u(ai, ag, Y) { var X, aa = c(Y); if (M.wk && M.wk < 312) { return X } if (aa) { if (typeof ai.id == D) { ai.id = Y } if (M.ie && M.win) { var ah = ""; for (var ae in ai) { if (ai[ae] != Object.prototype[ae]) { if (ae.toLowerCase() == "data") { ag.movie = ai[ae] } else { if (ae.toLowerCase() == "styleclass") { ah += ' class="' + ai[ae] + '"' } else { if (ae.toLowerCase() != "classid") { ah += " " + ae + '="' + ai[ae] + '"' } } } } } var af = ""; for (var ad in ag) { if (ag[ad] != Object.prototype[ad]) { af += '<param name="' + ad + '" value="' + ag[ad] + '" />' } } aa.outerHTML = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"' + ah + ">" + af + "</object>"; N[N.length] = ai.id; X = c(ai.id) } else { var Z = C(r); Z.setAttribute("type", q); for (var ac in ai) { if (ai[ac] != Object.prototype[ac]) { if (ac.toLowerCase() == "styleclass") { Z.setAttribute("class", ai[ac]) } else { if (ac.toLowerCase() != "classid") { Z.setAttribute(ac, ai[ac]) } } } } for (var ab in ag) { if (ag[ab] != Object.prototype[ab] && ab.toLowerCase() != "movie") { e(Z, ab, ag[ab]) } } aa.parentNode.replaceChild(Z, aa); X = Z } } return X } function e(Z, X, Y) { var aa = C("param"); aa.setAttribute("name", X); aa.setAttribute("value", Y); Z.appendChild(aa) } function y(Y) { var X = c(Y); if (X && X.nodeName == "OBJECT") { if (M.ie && M.win) { X.style.display = "none"; (function () { if (X.readyState == 4) { b(Y) } else { setTimeout(arguments.callee, 10) } })() } else { X.parentNode.removeChild(X) } } } function b(Z) { var Y = c(Z); if (Y) { for (var X in Y) { if (typeof Y[X] == "function") { Y[X] = null } } Y.parentNode.removeChild(Y) } } function c(Z) { var X = null; try { X = j.getElementById(Z) } catch (Y) { } return X } function C(X) { return j.createElement(X) } function i(Z, X, Y) { Z.attachEvent(X, Y); I[I.length] = [Z, X, Y] } function F(Z) { var Y = M.pv, X = Z.split("."); X[0] = parseInt(X[0], 10); X[1] = parseInt(X[1], 10) || 0; X[2] = parseInt(X[2], 10) || 0; return (Y[0] > X[0] || (Y[0] == X[0] && Y[1] > X[1]) || (Y[0] == X[0] && Y[1] == X[1] && Y[2] >= X[2])) ? true : false } function v(ac, Y, ad, ab) { if (M.ie && M.mac) { return } var aa = j.getElementsByTagName("head")[0]; if (!aa) { return } var X = (ad && typeof ad == "string") ? ad : "screen"; if (ab) { n = null; G = null } if (!n || G != X) { var Z = C("style"); Z.setAttribute("type", "text/css"); Z.setAttribute("media", X); n = aa.appendChild(Z); if (M.ie && M.win && typeof j.styleSheets != D && j.styleSheets.length > 0) { n = j.styleSheets[j.styleSheets.length - 1] } G = X } if (M.ie && M.win) { if (n && typeof n.addRule == r) { n.addRule(ac, Y) } } else { if (n && typeof j.createTextNode != D) { n.appendChild(j.createTextNode(ac + " {" + Y + "}")) } } } function w(Z, X) { if (!m) { return } var Y = X ? "visible" : "hidden"; if (J && c(Z)) { c(Z).style.visibility = Y } else { v("#" + Z, "visibility:" + Y) } } function L(Y) { var Z = /[\\\"<>\.;]/; var X = Z.exec(Y) != null; return X && typeof encodeURIComponent != D ? encodeURIComponent(Y) : Y } var d = function () { if (M.ie && M.win) { window.attachEvent("onunload", function () { var ac = I.length; for (var ab = 0; ab < ac; ab++) { I[ab][0].detachEvent(I[ab][1], I[ab][2]) } var Z = N.length; for (var aa = 0; aa < Z; aa++) { y(N[aa]) } for (var Y in M) { M[Y] = null } M = null; for (var X in $v.swfobject) { $v.swfobject[X] = null } $v.swfobject = null }) } } (); return { registerObject: function (ab, X, aa, Z) { if (M.w3 && ab && X) { var Y = {}; Y.id = ab; Y.swfVersion = X; Y.expressInstall = aa; Y.callbackFn = Z; o[o.length] = Y; w(ab, false) } else { if (Z) { Z({ success: false, id: ab }) } } }, getObjectById: function (X) { if (M.w3) { return z(X) } }, embedSWF: function (ab, ah, ae, ag, Y, aa, Z, ad, af, ac) { var X = { success: false, id: ah }; if (M.w3 && !(M.wk && M.wk < 312) && ab && ah && ae && ag && Y) { w(ah, false); K(function () { ae += ""; ag += ""; var aj = {}; if (af && typeof af === r) { for (var al in af) { aj[al] = af[al] } } aj.data = ab; aj.width = ae; aj.height = ag; var am = {}; if (ad && typeof ad === r) { for (var ak in ad) { am[ak] = ad[ak] } } if (Z && typeof Z === r) { for (var ai in Z) { if (typeof am.flashvars != D) { am.flashvars += "&" + ai + "=" + Z[ai] } else { am.flashvars = ai + "=" + Z[ai] } } } if (F(Y)) { var an = u(aj, am, ah); if (aj.id == ah) { w(ah, true) } X.success = true; X.ref = an } else { if (aa && A()) { aj.data = aa; P(aj, am, ah, ac); return } else { w(ah, true) } } if (ac) { ac(X) } }) } else { if (ac) { ac(X) } } }, switchOffAutoHideShow: function () { m = false }, ua: M, getFlashPlayerVersion: function () { return { major: M.pv[0], minor: M.pv[1], release: M.pv[2]} }, hasFlashPlayerVersion: F, createSWF: function (Z, Y, X) { if (M.w3) { return u(Z, Y, X) } else { return undefined } }, showExpressInstall: function (Z, aa, X, Y) { if (M.w3 && A()) { P(Z, aa, X, Y) } }, removeSWF: function (X) { if (M.w3) { y(X) } }, createCSS: function (aa, Z, Y, X) { if (M.w3) { v(aa, Z, Y, X) } }, addDomLoadEvent: K, addLoadEvent: s, getQueryParamValue: function (aa) { var Z = j.location.search || j.location.hash; if (Z) { if (/\?/.test(Z)) { Z = Z.split("?")[1] } if (aa == null) { return L(Z) } var Y = Z.split("&"); for (var X = 0; X < Y.length; X++) { if (Y[X].substring(0, Y[X].indexOf("=")) == aa) { return L(Y[X].substring((Y[X].indexOf("=") + 1))) } } } return "" }, expressInstallCallback: function () { if (a) { var X = c(R); if (X && l) { X.parentNode.replaceChild(l, X); if (Q) { w(Q, true); if (M.ie && M.win) { l.style.display = "block" } } if (E) { E(B) } } a = false } } } } ();

$v.timestamp = function (minutes) {
    var date = new Date();
    if (typeof(minutes) != 'undefined') { date.setMinutes(date.getMinutes() + minutes, date.getSeconds(), date.getMilliseconds()); }
    return date.getTime();
};

$v.cookie = {
    get: function (name) { var rx = new RegExp(name + "=([^;]+)"); var value = rx.exec(document.cookie); return (value != null) ? unescape(value[1]) : ''; },
    set: function (name, value, mode) { var date = new Date(); date.setTime(date.getTime() + (100 * 24 * 60 * 60 * 10000)); var string = name + "=" + value + "; " + ((mode == undefined) ? " expires=" + date + ";" : "") + " path=/"; document.cookie = string; }
};

$v.session = (function () {
    var label = '_vsid', empty = '', key = ['id', 'ts', 'ex', 'm', 'bs', 'bf'], o = {}, log = $v.log,
    toObject = function (c) { var o = {}; c = c.split('|'); for (var i = 0; i < key.length; i++) { try { o[key[i]] = c[i]; } catch (e) { o[key[i]] = '', log("session - " + key[i] + " not found"); } }; return o; },
    toArray = function (o) { var a = []; for (var i = 0; i < key.length; i++) { a.push(o[key[i]]); }; return a.join('|'); },
    expire = function () { },
    write = function () {
        $v.cookie.set(label, toArray(o), 'session');
    },
    create = function () {
        var ts = $v.timestamp();
        o = { id: ts, ts: ts, ex: $v.timestamp(30), m:'', bs:0, bf:0 };
        write();
    },
    get = function (key) {
        if (key == 'ts') {
            var c = $v.cookie.get(label);
            var ro = toObject(c);
            o[key] = ro.ts;
        }
        return (!$v.def(key)) ? o : o[key];
    },
    set = function (key, value) {
        o[key] = value;
        o.ex = $v.timestamp(30);
        write();
    },
    init = function () {
        var c = $v.cookie.get(label);
        if (c == empty) { create(); }
        else { o = toObject(c); }
    } ();
    return {
        set: function(key, value) { set(key, value); },
        get: function(key) { return get(key); },
        clear: function() { return create(); }
    };
})();

$v.events = (function () {
    var fns = [],
    isReady = (document.readyState != undefined && (document.readyState == "complete" || document.readyState == "interactive") && document.body != null) ? true : false,
    event = function (fn) { if (typeof fn == 'string') { return function () { eval(fn); } }; return fn; },
    ready = function () {
        isReady = true;
        for (var i = 0; i < fns.length; i++) {
            try { fns[i](); } catch (ex) { }
        }
    },
    addEvent = function (fn) {
        fn = event(fn);
        if (isReady) {
            fn();
        } else {
            fns[fns.length] = fn;
        }
    };
    if (window.addEventListener) {
        document.addEventListener('DOMContentLoaded', function () { $v.events.ready(); }, false);
    }  else if (document.attachEvent) {
		document.attachEvent("onreadystatechange", function () {
			if (document.readyState === "complete") {
				document.detachEvent("onreadystatechange", arguments.callee);
				$v.events.ready();
			}
		});
        (function () {
            if (!document.uniqueID && document.expando) return;
            var tempNode = document.createElement('document:ready');
            try {
                tempNode.doScroll('left');
                ready();
            } catch (err) {
                setTimeout(arguments.callee, 0);
            }
        })();
    };
    return {
        add: function (fn) { addEvent(fn); },
        isReady: function () { return isReady; },
        ready: function() { ready();}
    };
})();

$v.queue = function (obj) { $v.events.add(obj); };

$v.merge = function (from, to) {
    var result = {}, length = arguments.length, object = null, key = null; for (var i = 0; i < length; ++i) { object = arguments[i]; for (var key in object) { if (!object.hasOwnProperty(key)) { continue; } result[key] = object[key]; } } return result;
};

$v.stat = (function () {
    var image = function (src) {
        var ls = $v.session.get('ts');
        var now = $v.timestamp();
        $v.session.set('ts', now);
        var img = document.createElement('img');
        img.id = $v.timestamp();
        img.src = src + '&ls=' + ls + '&ts=' + now;
        $v.log("stat length - " + src.length + " - decoded :" + $v.decoder(src));
        return img;
    };
    return {
        send: function(src) {
            return image(src);
        }
    };
})();

$v.browser = (function () {
    var label = "_vbid", _bid = '', err = 'undefined', empty = '', context = $v.context(),
    log = $v.log,
    url = function (a, q) {
        return $v.url('/t/' + a + '/' + context.sid + '/' + _bid + '/' + context.si + '?' + q);
    },
    detail = {
        timezone: function () { var d = new Date(); return -d.getTimezoneOffset() / 60; },
        display: {
            res: function () { return screen.width + 'x' + screen.height; },
            cd: function () { return screen.colorDepth; },
            pd: function () { return screen.pixelDepth; }
        },
        plugins: function () {
            var p = []; var n = navigator.plugins;
            for (var i = 0; i < n.length; i++) {
                p.push(n[i].name + '|' + n[i].version);
            };
            return p.join(';');
        },
        build: function () {
            var r = $v.encoder(document.referrer);
            var u = $v.encoder(window.location.href);
            return 'r=' + r + '&u=' + u + '&s=' + this.display.res() + '&scd=' + this.display.cd() + '&spd=' + this.display.pd() + '&p=' + $v.encoder(this.plugins()) + '&tz=' + this.timezone();
        },
        font: function (s) {
            var g = unescape(s).replace(/\s/g, '');
            var ga = g.split(','); s = 0, sa = [];
            for (var i = 0; i < ga.length; i++) {
                s = s + ga[i].length;
                sa.push(ga[i]);
                if (s >= 1200 || i == ga.length - 1) {
                    $v.stat.send(url('bf', 'f=' + $v.encoder(sa.join(';'))));
                    s = 0, sa = [];
                }
            }
        },
        session: function () {
            var sent = $v.session.get('bs');
            if (_bid != empty && sent == 0) {
                $v.stat.send(url('bs', detail.build()));
                $v.session.set('bs', 1);
                storage.lazy();
            };
        },
        callback: function (u, f) {
            var sent = $v.session.get('bf');
            if (!$v.isEmbed() && sent == 0) {
                 this.font(f);
                 $v.session.set('bf', 1);
            }
        }
    },
    storage = {
        objects: {
            global: function (value) {
                if (window.globalStorage) {
                    try {
                        var host = storage.host();
                        if ($v.def(value)) {
                            eval("globalStorage[host]." + label + " = value");
                        } else {
                            var global = eval("globalStorage[host]." + name);
                            if (typeof (global) == Object) return global.value;
                            return storage.check(global);
                        }
                    } catch (e) { log('objects.global.set - ' + e); }
                };
                return empty;
            },
            session: function (value) {
                try {
                    if (window.sessionStorage) {
                        if ($v.def(value)) { sessionStorage.setItem(label, value); }
                        else { return storage.check(sessionStorage.getItem(label)); }
                    }
                } catch (e) { log('objects.session.set - ' + e); }
                return empty;
            },
            local: function (value) {
                try {
                    if (window.localStorage) {
                        if ($v.def(value)) { localStorage.setItem(label, value); }
                        else { return storage.check(localStorage.getItem(label)); }
                    }
                } catch (e) { log('objects.local.set - ' + e); }
                return empty;
            }
        },
        lazy: function (value) {
            var fn = function () {
                var div = storage.element('div', 'vioapi', true);
                var par = { allowScriptAccess: 'always' };
                if ($v.def(value)) { par.flashvars = "_vgid=" + value; };
                $v.swfobject.createSWF({ data: $v.url('/library/flash.api.swf'), width: 1, height: 1 }, par, "vioapi");
            };
            if (!$v.def(value)) {
                $v.swfobject.addDomLoadEvent(fn);
            } else {
                fn();
            };
        },
        check: function (obj) { return (obj == null || obj == 'null' || obj == err || obj == empty) ? empty : obj; },
        get: function () {
            var bid = $v.cookie.get(label);
            if (!bid == empty) return bid;
            for (var area in storage.objects) {
                var value = eval('storage.objects.' + area + '()');
                log(area + ' storage-' + value);
                if (value != empty) { return value; }
            };
            return empty;
        },
        set: function (bid) {
            _bid = bid;
            for (var area in storage.objects) { eval('storage.objects.' + area + '(bid)'); }
        },
        host: function () {
            var domain = document.location.host;
            if (domain.indexOf('www.') == 0) { domain = domain.replace('www.', ''); }
            return domain;
        },
        element: function (type, name, append) {
            var el = (typeof name != err && document.getElementById(name)) ? document.getElementById(name) : document.createElement(type);
            el.style.visibility = 'hidden';
            el.style.position = 'absolute';
            if (name) { el.setAttribute('id', name); }
            if (append) { document.body.appendChild(el); }
            return el;
        }
    },
    get = function () {
        if (_bid == empty) { _bid = storage.get(); };
        return _bid;
    },
    set = function (obj) {
        get();
        if (_bid == empty) { storage.set(obj.gid == empty ? obj.nid : obj.gid); }
        if ($v.cookie.get(label) == empty) { $v.cookie.set(label, _bid); }
        return _bid;
    },
    init = function (obj) {
        _sid = $v.session.get('id');
        if (!ok) { _aid = obj.aid, _gid = obj.gid; _nid = obj.nid; ok = true; };
        restore();
    },
    id = function (obj) {
        if ($v.def(obj)) { set(obj); }
        get();
        detail.session();
        return _bid;
    },
    restore = function () {
        if (_bid != empty) return _bid;
        var bid = get();
        _bid = (storage.check(bid) == empty) ? _nid : bid;
        return set(_bid);
    };
    return {
        callback: function(b, f) { detail.callback(b, f); },
        id: function(obj) { return id(obj); }
    };
})();


(function(){
    var context = $v.context(); 
    var url = $v.url('/js/'+ context.sid + '/'+ context.si +'/loader.js');
    var isReady = $v.events.isReady();
    $v.jsonp("", url, isReady ? false: true);
})();


$v.track = (function () {
    var _pi, _t, _u, _r = document.referrer,
    plog = [],
    def = $v.def,
    pi = function () { _pi = $v.timestamp(); },
    track = function (event, id, pi, vi, h, t, u, r) {
        $v.queue(function () {
            var context = $v.context();
            var e = { id: id, pi: pi, vi: vi, h: h, pt: t, pu: u, pr: r };
            var message = $v.encoder(JSON.stringify($v.merge(e, context)));
            $v.stat.send($v.url('/reporting/stat/r?e=' + event + '&d=' + message));
        });
    },
    signal = function (event, data) {
        $v.queue(function () {
            var context = $v.context();
            var e = { d: data };
            var message = $v.encoder(JSON.stringify($v.merge(e, context)));
            $v.stat.send($v.url('/reporting/logger/log/r?e=' + event + '&d=' + message));
        });
    },
    players = {
        id: function (playerId) { return (!def(playerId)) ? 'none' : 'p' + playerId; },
        log: function (playerId) {
            var id = this.id(playerId), log = plog[id];
            if (!def(log)) { this.add(playerId); }
            return plog[id];
        },
        add: function (playerId, playerName, groupId) {
            var id = this.id(playerId), log = plog[id];
            if (!def(log)) { log = { id: playerId || id, name: playerName || playerId, groupId: groupId, videos: [] }; plog[id] = log; }
            return log;
        }
    },
    videos = {
        id: function (videoId) { return (!def(videoId)) ? $v.timestamp : 'v' + videoId; },
        log: function (playerId, videoId, options) {
            var id = this.id(videoId),
            log = players.log(playerId),
            vid = log.videos[id];
            if (!def(vid)) {
                // fix for null options
                var h = { f: '', b: '', q: '', pid: log.id, pname: log.name, rid: '' };
                if (def(options)) { h.f = options.format || ''; h.b = options.bitrate || ''; h.q = options.quality || ''; h.rid = options.referenceId || ''; }
                vid = { id: videoId || id, playerId: log.id, h: h, vi: $v.timestamp(), p: { ping: $v.timestamp(), engaged: 0, time: 0 }, state: '', plays: 1 };
                log.videos[id] = vid;
            };
            return vid;
        },
        isRepeat: function (event, vid) {
            if (vid.state != '' && event == 'video.load') {
                vid.vi = $v.timestamp();
                vid.p = { ping: $v.timestamp(), engaged: 0, time: 0 };
                vid.plays = vid.plays + 1;
            }
        },
        autoview: function (vid) {
            if (vid.state == 'video.load') {
                vid.state = 'video.view';
                track('video.view', vid.id, _pi, vid.vi, vid.h, _t, _u, _r);
            }
        },
        init: function (event, videoId, playerId, options) {
            var vid = this.log(playerId, videoId, options);
            this.isRepeat(event, vid);
            if (vid.state != event) {
                vid.p.ping = $v.timestamp();
                track(event, vid.id, _pi, vid.vi, vid.h, _t, _u, _r);
                vid.state = event;
            }
        },
        progress: function (videoId, playerId, time) {
            var vid = this.log(playerId, videoId), ping = $v.timestamp();
            this.autoview(vid);
            time = Math.abs(time);
            var logtime = Math.abs(vid.p.time);
            var edelta = Math.round((ping - vid.p.ping) / 1000);
            var tdelta = Math.round((time > logtime) ? time - logtime : 0);
            vid.p.time = Math.round((time > logtime) ? time : logtime);
            vid.p.ping = ping;
            vid.p.engaged = vid.p.engaged + edelta;
            if (true) {
                track('video.progress', vid.id, _pi, vid.vi, $v.merge({ ed: edelta, td: tdelta }, vid.h), _t, _u, _r);
            }
        },
        end: function (videoId, playerId) {
            $v.log('video.end');
            var vid = this.log(playerId, videoId), ping = $v.timestamp();
            vid.state = 'video.end';
            var logtime = Math.abs(vid.p.time);
            var time = Math.round((ping - vid.p.ping) / 1000);
            this.progress(videoId, playerId, logtime + time);
            track('video.end', vid.id, _pi, vid.vi, vid.h, _t, _u, _r);
        }
    },
    page = function (path, title) {
        pi();
        var ajax = (def(path) && def(title));
        var loc = window.location;
        _t = (ajax) ? title : document.title;
        _r = (ajax) ? _u : document.referrer;
        _u = (ajax) ? loc.protocol + '//' + loc.host + path : window.location.href;
        if (!$v.isEmbed()) { track('page.view', _u, _pi, '', {}, _t, _u, _r); };
    },
    init = function () { page(); } ();
    return {
        page: {
            ajax: function(path, title) { page(path, title); }
        },
        player: {
            add: function(playerId, playerName) { players.add(playerId, playerName); }
        },
        video: {
            load: function(videoId, playerId, options) { videos.init('video.load', videoId, playerId, options); },
            view: function(videoId, playerId) { videos.init('video.view', videoId, playerId); },
            progress: function(videoId, playerId, time) { videos.progress(videoId, playerId, time); },
            end: function(videoId, playerId) { videos.end(videoId, playerId); }
        },
        signal: {
            event: function(type, data) { signal(type, data); }
        },
        log: function() { return plog; }
    };
})();



