/**
 * Viewdle [vdirectresult] widget hp
 * 
 * @version 0.1.2
 */

var VD_SERVER = "http://reuters.viewdle.com";
var VD_SERVER_MOCK = "http://reuters.viewdle.com";

var VD_DIRECT_RESULT_CLASS_NAME = "vdirectresult";

var VD_MOUSE_OFFSET = 15;

var VD_FLASH_MOVIE = VD_SERVER + "/widgets/flash/widget-player-vface-new.swf";
var VD_FLASH_OBJ = "vdFlash";
var VD_FLASH_EMB = "vdFlashEmb";
var VD_FLASH_WIDTH = 320;
var VD_FLASH_HEIGHT = 240;
var VD_FLASH_VAR_PLAYLIST = "playList=";

var VD_CITATION_OPT = "&mute=0&cropVideo=0";

var css = "a.vdirectresult{background-color:transparent;text-decoration:none;border-bottom:1px dashed #00c;padding:0;margin:0;position:relative;outline:0 solid;}a.vdirectresult:hover{z-index:1000;}a.vdirectresult div#v-div{padding:0;margin:0;border:0 solid;position:absolute;display:inline;background-color:transparent;background:transparent;z-index:9999;}"

document.write("<style type=\"text/css\">"+css+"</style>");

var browser = {
    IE:     !!(window.attachEvent && !window.opera),
    Opera:  !!window.opera,
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
};

function inspectElement(oElement){
    var result = "";
    for(var item in oElement){
        result += item + "=" + oElement[item] + "\n";
    }
    alert(oElement.nodeName+":\n"+result);
}

function isDirectResult(oElement){
    return (oElement.className.toLowerCase() == VD_DIRECT_RESULT_CLASS_NAME.toLowerCase());
}

function isWidget(oElement){
    return (isDirectResult(oElement)); 
}

function vdGetWidgetsNode(oNode){
    while(isWidget(oNode) == false){
        oNode = oNode.parentNode;
    }
    return oNode;
}

function vdShowDiv(parentNode, event) {
    try {
        var _parentNode = parentNode;
        if(_parentNode.state == "active"){
            return false;
        }
        _parentNode.state = "active";
        vdHideAllDivs();

        var div = vdGetDivFromA(_parentNode);
        if (div == undefined && isWidget(_parentNode)){
            var offsetX = event.layerX ? event.layerX : event.x;

            if(browser.WebKit){
                offsetX = _parentNode.offsetWidth/2 - VD_MOUSE_OFFSET;
            }

            div = document.createElement("div");
            div.id="v-div";
            div.className="v-div";
            div.innerHTML = vdFlashObj(VD_FLASH_WIDTH, VD_FLASH_HEIGHT, _parentNode.playlist);
            div.style.visibility = "visible";
            div.style.zIndex="9999";
            div.style.left = (offsetX + VD_MOUSE_OFFSET) + "px";

            if (div.addEventListener) {
                div.addEventListener ("mouseover", function(){
                    var a = vdGetWidgetsNode(this);
                    a.state = "active";
                }, false);
                div.addEventListener ("mouseout", function(){ 
                    var a = vdGetWidgetsNode(this);
                    a.state = "passive";
                    vdUpdateStatus("");
                 }, false);
            } else {
//              for IE
                div.onmouseover = function(){
                    var a = vdGetWidgetsNode(this); 
                    a.state = "active";
                };
                div.onmouseleave = function(){
                    var a = vdGetWidgetsNode(this);
                    a.state = "passive"; 
                    vdUpdateStatus("");
                };
            }
            _parentNode.appendChild(div);
            
            vdResizeFlashObj(320, 240);
        }
    } catch(e) {
    }
}

//used in flash
function vdHideAllDivs(forced){
    try {
        var links = document.getElementsByTagName("a");
        for (var i = 0; i < links.length; i++){
            var link = links[i];
            if(isWidget(link)){
                if(forced == undefined || forced == false) {
                    if(link.state == "active"){
                        link.style.zIndex = "9999";
                        continue;
                    }
                }
                link.state = "passive";
                link.isSticked = false;
                link.style.zIndex = "10";
                var divs = link.getElementsByTagName("div");
                for(var j = 0; j < divs.length; j++){
                    var div = divs[j];
                    div.innerHTML = "";
                    link.removeChild(div);
                }
            }
        }
    }catch(e){}
}

function vdGetDivFromA(node){
    var result = node.getElementsByTagName("div")[0];
    if(result != null){
        if(result.className != "v-div" ){
           result = 1;
        }
    }
    return result;
}

/**
 * Flash callback
 */
function vdResizeFlashObj(w, h) {
    var vdFlash;
    if(document.getElementById(VD_FLASH_EMB) != null){
        vdFlash = document.getElementById(VD_FLASH_EMB);
    }else if(document.getElementById(VD_FLASH_OBJ) != null){    
        vdFlash = document.getElementById(VD_FLASH_OBJ);
    }
    vdObjectAlign(vdFlash, parseInt(w), parseInt(h));
}

function vdObjectAlign(vdFlash, w, h){
    vdFlash.width = w;
    vdFlash.height = h;
    var div = vdGetDiv(vdFlash);
    div.style.top = VD_MOUSE_OFFSET + "px";
}

function vdGetDiv(obj){
    var result;
    while(obj.nodeName.toLowerCase() != "div"){
        obj = obj.parentNode;
        result = obj;
    }
    return result;
}

/*
 * Utility
 */
function vdGetDirectResultFromTitle(title) {
    return vdfindPattern(title, "playlist=(.[^&]*)");
}

function vdfindPattern(str, patternStr, replaceChar){
    var result = null;
    var pattern = new RegExp(patternStr);
    var match = pattern.exec(str);
    if(match != null){
        result = match[1];
        if(replaceChar){
            result = result.replace(replaceChar, "");
        }
    }
    return result;
}

function vdGetPlaylistPath(link){
    return VD_FLASH_VAR_PLAYLIST + vdGetDirectResultFromTitle(link.title) + VD_CITATION_OPT;
}

function vdGetParentNode(e) {
    var _paretNode;
//  for IE
    if(e.toElement != undefined){
        var action = e.type;
        if(action == "mouseover" || action == "click"){
            _parentNode = e.toElement;
        }else if (action == "mouseout" || action == "mouseleave"){
            _parentNode = e.fromElement;
        }
    }else{
        _parentNode = e.target || e.relatedTarget;
    }
    _parentNode = vdGetWidgetsNode(_parentNode);
    return _parentNode;
}

function vdFlashObj(w, h, flashvars){
    var result = "<object id='"+VD_FLASH_OBJ+"' width='"+w+"' height='"+h+"' " +
                 "classid='clsid:d27cdb6e-ae6d-11cf-96b8-444553540000' " + 
                 "codebase='http://fpdownload.macromedia.com/pub/shockwave/" +
                 "cabs/flash/swflash.cab#version=8,0,0,0'>" +
                 "<param name='allowScriptAccess' value='always' />" +
                 "<param name='wmode' value='transparent' />"+
                 "<param name='movie' value='"+VD_FLASH_MOVIE+"' />" +
                 "<param name='FlashVars' value='"+flashvars+"'/>" +
                 "<embed id='"+VD_FLASH_EMB+"' width='"+w+"' height='"+h+"' " +
                 "src='"+VD_FLASH_MOVIE+"' wmode='opaque' quality='high' "+ 
                 "flashvars='"+flashvars+"' " +
                 "type='application/x-shockwave-flash' "+
                 "allowscriptaccess='always' /></object>";
    return result;
}

function vdOnMouseOut(e, ref){
    try {
        vdUpdateStatus("");
        var _parentNode;
        if(browser.IE){
            _parentNode = vdGetWidgetsNode(ref);
        }else{
            _parentNode = vdGetParentNode(e);
        }
        _parentNode.state = "passive";
    } catch(error) {}
}

function vdUpdateStatus(str){
    window.status = str;
    return true;
}

function vdOnMouseOver(){
   return vdUpdateStatus("Click to show widget");
}

// redirect
function vdShowPlayer(id, pid, flvPath){
    showFlashObject(id, pid, "", flvPath);
}

function vdOnClick (e, ref){
    var _parentNode;
    if(!e){
        e = window.event;
    }
    if(browser.IE){
        _parentNode = vdGetWidgetsNode(ref);
    }else{
        _parentNode = vdGetParentNode(e);
    }

    _parentNode.isSticked = _parentNode.isSticked ? false : true;
    if(_parentNode.isSticked){
        if (!e) var e = window.event;
        e.cancelBubble = true;
        if (e.stopPropagation) e.stopPropagation();
        vdShowDiv(_parentNode, e);
    }else{
//     vdShowPlayer(_parentNode.id, _parentNode.pid, _parentNode.flvPath);
        vdHideAllDivs(true);
    }
    return false;
}

//init
function vdOnLoad() {
    var links = document.getElementsByTagName("a");
    for (var i = 0; i < links.length; i++){
        var link = links[i];
        if(isDirectResult(link)){
            link.state = "passive";
            link.isSticked = false;
            link.playlist = vdGetPlaylistPath(link);

            try {
                var pl = unescape(vdGetDirectResultFromTitle(link.title));
                var plXml;
                if(browser.IE){
                    plXml=new ActiveXObject("Microsoft.XMLDOM");
                    plXml.async="false";
                    plXml.loadXML(pl);
                }else{
                    var parser=new DOMParser();
                    plXml = parser.parseFromString(pl,"text/xml");
                }

                var att  = plXml.getElementsByTagName("item")[0].attributes;

                for(var j = 0; j < att.length; j++){
                    if(att[j].nodeName == "pid"){
                        link.pid = att[j].nodeValue; 
                    }
                    if(att[j].nodeName == "flvPath"){
                        link.flvPath = att[j].nodeValue; 
                    }
                    if(att[j].nodeName == "id"){
                       var idPath = att[j].nodeValue;
                       var t =  idPath.split("/");
                       link.id  = t[t.length-1];
                    }
                }
            }catch(error){}
            
            link.title = "";
            if (browser.IE) {
                link.onmouseover = function(){vdOnMouseOver(event);};
                link.onmouseleave = function(){vdOnMouseOut(event, this);};
                link.onclick = function(){ return vdOnClick(event, this);};
            }else{
                link.onmouseover = vdOnMouseOver;
                link.onmouseout = vdOnMouseOut;
                link.onclick = vdOnClick;
            }
        }else{
            continue;
        }
    }
}

function addOnLoadHandler(func) {
    if (window.addEventListener) { 
        /* FF, Safari */ 
        window.addEventListener("load", func, true);
    } else if (window.attachEvent) { 
        /* IE */
        window.attachEvent("onload", func);
    }
}
addOnLoadHandler(vdOnLoad);