// Global variables
var gListEngines = null;
var gEngineIdx = 0;
var gSearchAllowed = true;
var gForm = null;

/*******************************************************************************************
 * Ajax
 ******************************************************************************************/

/*
 * Private
 * Create XML HTTP object
 */
function getXmlHttpObject()
{
    var xmlHttp=null;
    try {
        // Firefox, Opera 8.0+, Safari
        xmlHttp=new XMLHttpRequest();
    } catch (e) {
        // Internet Explorer
        try {
            xmlHttp=new ActiveXObject("Msxml2.XMLHTTP");
        } catch (e) {
            xmlHttp=new ActiveXObject("Microsoft.XMLHTTP");
        }
    }
    return xmlHttp;
}

/**
 * Main function to fire ajax request
 */
function makeHttpRequest(url, method, callback, isXml)
{
    var req = getXmlHttpObject();
    
    if (!req) {
        alert("Your browser doesn't support this feature (Ajax)");
        return false;
    }

    req.onreadystatechange = function() {
        if (req.readyState == 4)
        {
            if (req.status == 200) {
                if (isXml) {
                    eval(callback + '(req.responseXML)');
                } else {
                    eval(callback + '(req.responseText)');
                }
            } else {
                alert("Something gone wrong! Server busy?");
                stopSearch();
            }
        }
    };
    
    req.open(method, url, true);
    req.send(null);
}

/*
 * Simple proxy function for GET HTTP request
 */
function makeGetRequest(url, callback, isXml)
{
    makeHttpRequest(url, "GET", callback, isXml);
}

/*
 * Simple proxy function for POST HTTP request
 */
function makePostRequest(url, callback, isXml)
{
    makeHttpRequest(url, "POST", callback, isXml);
}

/*******************************************************************************************
 * Engines
 ******************************************************************************************/

function cEngine (id, host) {
  this.id = id;
  this.host = host;
}

/**
 * Generate a HTTP request
 */
function onSearchEngines(form)
{
    var lang = form.elements["lang"].value;
    var title = form.elements["title"].value;
    
    gForm= form;

    if (title != null && title.length > 0) {
        url = "subbiee/query.php?action=GR2&lang=" + lang + "&xid=" + xid;
        makeGetRequest(url, "callback_xmlEngines", true);
    }
}

/*
 * Callback function for processing list of engines (XML)
 */
function callback_xmlEngines(xml)
{
    if (xml) {
        // Parse XML
        var list = xml.getElementsByTagName("engine");
        gListEngines = new Array();
        
        for (i = 0; i < list.length; i++) {
            if (gListEngines) {
            	// Find the attribute id
            	var id = null;
            	for (j = 0; j < list[i].attributes.length && id == null; j++) {
            		if (list[i].attributes[j].nodeName == "id") {
            			id = list[i].attributes[j].nodeValue;
            		}
            	}
            	if (id) {
	                gListEngines[i] = new cEngine(id, list[i].firstChild.nodeValue);
	            }
            }
        }
    }
    
    if (gListEngines.length > 0) {
        //showEngines(gListEngines);
        searchSubtitles();
    }
}

function showEngines(list) 
{
    document.getElementById("result").innerHTML = "";
    for (i = 0; i < list.length; i++) {
        document.getElementById("result").innerHTML += list[i].id + " [" + list[i].host + "]<br />";
    }
}

function searchSubtitles()
{
    startWaitingbar('waitingBar', 'waitingBarStatus');
    gEngineIdx = 0;
    gSearchAllowed = true;
    
    document.getElementById("search_result").innerHTML = "";
    document.getElementById("ads_link").innerHTML = "";
    
    //createAdsLink();
    
    // Init waiting bar
    drawWaitingBarStatus('waitingBarStatus', gListEngines.length, 0, gListEngines[0]);
    onSearchSubtitles(gListEngines[0]);
}

/*******************************************************************************************
 * Subtitles
 ******************************************************************************************/

/**
 * Generate a HTTP request
 */
function onSearchSubtitles(engine)
{
    //var form = document.forms["formSearch"];
    var title = gForm.elements["title"].value;
    var lang = gForm.elements["lang"].value;
    
    if (title && title.length > 0) {
        url = "subbiee/query.php?action=C0X&title=" + encodeURI(title) + "&lang=" + lang + "&engine=" + engine.id + "&xid=" + xid;
        //makeGetRequest(url, "callback_xmlSubtitles", true);
        makeGetRequest(url, "callback_htmlSubtitles", false);
    } else {
        // Close waiting bar
        drawWaitingBarStatus('waitingBarStatus', 1, 1, null);
        hideLayer('box_waiting_bar');
    }    
}

 /*
 * Callback function for processing list of engines (XML)
 */
function callback_xmlSubtitles(xml)
{
    alert(xml.data);
    
    if (xml) {
        // Parse XML
        var nodeBaseList = xml.getElementsByTagName("base");
        var nodeBase = null;
        if (nodeBaseList) {
        	nodeBase = nodeBaseList[0];
       	}

        var nodeResults = xml.getElementsByTagName("results");
        
        var out = document.getElementById("result");
        
        if (nodeBase != null && out != null) {
            out.innerHTML += nodeBase.firstChild.nodeValue + "<br />";
        }
    }
    
    // Get subtitles from the next engine
    if (++gEngineIdx < gListEngines.length) {
        // Update waiting bar
        drawWaitingBarStatus('waitingBarStatus', gListEngines.length, gEngineIdx, gListEngines[gEngineIdx]);
        // Search
        onSearchSubtitles(gListEngines[gEngineIdx]);
    } else {
        // Close waiting bar
        drawWaitingBarStatus('waitingBarStatus', gListEngines.length, gEngineIdx, null);
        
        alert("Finished!");
    }
}

function callback_htmlSubtitles(text)
{
    var name = "search_result";
    
    if (text) {
        //document.getElementById(name).innerHTML += "<table border=\"0\">" + text + "</table>";
        document.getElementById(name).innerHTML += text;
    }

    // Get subtitles from the next engine
    if (gSearchAllowed && ++gEngineIdx < gListEngines.length) {
        // Update waiting bar
        drawWaitingBarStatus('waitingBarStatus', gListEngines.length, gEngineIdx, gListEngines[gEngineIdx]);
        // Search
        onSearchSubtitles(gListEngines[gEngineIdx]);
    } else {
        // Close waiting bar
        drawWaitingBarStatus('waitingBarStatus', gListEngines.length, gEngineIdx, null);
        stopSearch();
        
//        document.getElementById("result").innerHTML += "<textarea rows=\"30\" cols=\"100\">" + document.getElementById("result").innerHTML;
//        alert("Finished!");
    }
}

function createAdsLink()
{
    var obj = document.getElementById("ads_link");
    
    var lang = gForm.elements["lang"].value;
    var title = gForm.elements["title"].value;

    var url = "http://www.allsubs.org/search-subtitle/" + encodeURI(title) + "/";
    var anchor1 = '<a href="' + url + '" target="_blank"><font color="#FF0000"><u><b>subtitles for </b></u></font>';
    anchor1 += '<font color="#CC0000"><u><b>' + title + '</b></u></font>';
    anchor1 += '</a>';
    var anchor2 = '<a href="' + url + '" target="_blank"><font color="#CC0000"><u>here</u></font></a>';

    var text = '<center>'; 
    text += 'Ads: <font color="#CC0000">You couldn\'t find the ' + anchor1 + '? '; 
    text += '<font color="#CC0000">Try to find them ' + anchor2 + '...';
    text += '</font>';
    text += '</center>';
    
    if (obj) {
        obj.innerHTML += text;
    }
}
