//vars
var ipaDataG;
var headNode = document.getElementById("headNode");
var pageNode = document.getElementById("pageNode");
var scriptsNode = document.getElementById("scriptsNode");
var queryString = new Object();
var isLanding = true;
var errorCode = 0;
var haveAFSAds = false;

//build entire pageNode body
function buildBody()
{
    //parse query
    queryString = parseQuery();

    //is landing?
    if ((queryString) && (queryString["s"]) && (queryString["s"].length > 0))
        isLanding = false;

    //call ipa interface
    callIpa();
}

//parse queries
function parseQuery()
{
    var queryString = new Object();
    window.location.search.replace(new RegExp("([^?=&]+)(=([^&]*))?", "g"),
        function ($0, $1, $2, $3)
        {
            queryString[$1] = decodeURIComponent($3);
        }
        );
    return queryString;
}

//call ipa interface
function callIpa()
{
    //build request url
    var requestUrl = "http://" + request.customerHost + "/interface/6/?mode=ipa&outputType=json&jsonWrapper=receiveIpa"
        + "&cid=" + encodeURIComponent(request.customerId)
        + "&url=" + encodeURIComponent(document.location.href);

    //have session-id cookie?
    if (exists(getCookie("pksid")))
        requestUrl += "&sid=" + encodeURIComponent(getCookie("pksid"));

    //have search term?
    if (!isLanding)
        requestUrl += "&st=" + encodeURIComponent(queryString["s"]);

    //referrer?
    if (exists(document.referrer))
        requestUrl += "&ref=" + encodeURIComponent(document.referrer);

    //add script
    var script = document.createElement("script");
    script.setAttribute("type", "text/javascript");
    script.setAttribute("src", requestUrl);
    scriptsNode.appendChild(script);
}

//ipa interface callback
function receiveIpa(ipaData)
{
    //set global for google callback
    ipaDataG = ipaData;

    //fill basic body text
    var bodyText = "";
    if (isLanding)
        bodyText = getLandingHtml(ipaData);
    else
        bodyText = getResultsHtml(ipaData);
    pageNode.innerHTML = bodyText;

    //set session-id cookie
    setCookie("pksid", ipaData.data.sid);

    //call google
    callGoogle(ipaData);
}

//call google
function callGoogle(ipaData)
{
    //build google request
    var request = "var google_afd_request = \r\n";
    request += "{\r\n";
    request += "    api: 2,\r\n";
    request += "    async: true,\r\n";
    request += "    feed: 'afs',\r\n";
    request += "    client: '" + ipaData.data.clientId + "',\r\n";
    request += "    channel: '" + ipaData.data.channel + "',\r\n";
    if (isLanding)
    {
        request += "    num_radlinks: 10,\r\n";
        request += "    num_ads: 0,\r\n";
        if (exists(ipaData.data.terms))
            request += "    terms: '" + ipaData.data.terms + "',\r\n";
    }
    else
    {
        request += "    num_radlinks: 3,\r\n";
        request += "    num_ads: 10,\r\n";
        request += "    q: '" + cleanValue(queryString["s"]) + "',\r\n";
        var token = "";
        if ((queryString["t"]) && (queryString["t"].length > 0))
            token = queryString["t"];
        else
            token = getCookie("gtok");
        request += "    token: '" + token + "',\r\n";
    }
    request += "    adext: 'as1,sr2',\r\n";
    request += "    backfill: 'on',\r\n";
    request += "    categories: 'off'\r\n";
    request += "};\r\n";

    //add script (request object)
    var scriptRequest = document.createElement("script");
    if (window.addEventListener)
        scriptRequest.appendChild(document.createTextNode(request));
    else
        scriptRequest.text = request;
    scriptRequest.setAttribute("language", "javascript");
    scriptRequest.setAttribute("type", "text/javascript");
    scriptsNode.appendChild(scriptRequest);

    //add script (link)
    var scriptLink = document.createElement("script");
    scriptLink.setAttribute("type", "text/javascript");
    scriptLink.setAttribute("language", "javascript");
    scriptLink.setAttribute("src", "http://pagead2.googlesyndication.com/apps/domainpark/show_afd_ads.js");
    scriptsNode.appendChild(scriptLink);
}

//google callback
function google_afd_ad_request_done(google_afd_response)
{
    //set google token
    if (exists(google_afd_response.search_token))
        setCookie("gtok", google_afd_response.search_token);

    //render search links
    var searchLinks = buildSearchLinks(google_afd_response, ipaDataG);
    var rsNode = document.getElementById("ipa_rs_links");
    if (exists(rsNode))
        rsNode.innerHTML = searchLinks;

    //render ads
    if (!isLanding)
    {
        var resultLinks = buildResultLinks(google_afd_response, ipaDataG);
        spNode = document.getElementById("ipa_sr");
        if (exists(spNode))
            spNode.innerHTML = resultLinks;

        if (haveAFSAds)
        {
            var script = document.createElement("script");
            script.setAttribute("type", "text/javascript");
            var scr = "fetchWebResults(ipaDataG);";
            script.text = scr;
            scriptsNode.appendChild(script);
        }
    }
}

//build search links
function buildSearchLinks(google_afd_response, ipaData)
{
    var searchLinks = "";
    if ((google_afd_response.radlinks) && (google_afd_response.radlinks.length > 0))
    {
        searchLinks += "<ul>";
        var google_radlinks = google_afd_response.radlinks;
        for (var i = 0; i < google_radlinks.length; i++)
        {
            var className = "i" + (i + 1);
            if (i == 0)
                className += " first";
            else if (i == (google_radlinks.length - 1))
                className += " last";
            searchLinks += "<li class='" + className + "'>";
            searchLinks += "<a href='/?s=" + encodeURIComponent(google_radlinks[i].term) + "&r=" + encodeURIComponent(i + 1) + "&t=" + google_radlinks[i].token + "'><span>" + google_radlinks[i].term + "</span></a>";
            searchLinks += "</li>";
        }
        searchLinks += "</ul>";
    }
    return searchLinks;
}

//build result links
function buildResultLinks(google_afd_response, ipaData)
{
    var resultLinks = "";
    if ((google_afd_response.ads) && (google_afd_response.ads.length > 0))
    {
        var google_ads = google_afd_response.ads;
        haveAFSAds = google_ads[0].url.indexOf("doubleclick.net") == -1;
        var headerText = "Sponsored Listings";
        resultLinks += "<h2>" + headerText + "</h2>";
        resultLinks += "<ul>";
        for (var i = 0; i < google_ads.length; i++)
        {
            var linkClass = "item_" + (i + 1);
            if (i == 0)
                linkClass += " first";
            else if (i == (google_ads.length - 1))
                linkClass += " last";
            var resultLink = renderResultLink(google_ads[i], linkClass, google_ads.length, ipaData)
            resultLinks += resultLink;
        }
        resultLinks += "</ul>";
    }
    return resultLinks;
}

//render a single result link
function renderResultLink(ad, linkClass, adCount, ipaData)
{
    var resultLink = "";
    var clickUrl = buildClickUrl(ad.url, ad.n, ad.visible_url, adCount, ipaData);

    var abs = ad.line2;
    if (ad.line3)
        abs += " " + ad.line3;

    resultLink += "<li class='" + linkClass + "'>";
    resultLink += "<a class='title' href='" + clickUrl + "' target='_blank'>" + ad.line1 + "</a>";
    resultLink += "<a class='url' href='" + clickUrl + "' target='_blank'>" + ad.visible_url + "</a>";
    resultLink += "<p class='abstract'>" + abs + "</p>";

    if (exists(ad.seller_ratings))
    {
        //version 2
        sellerRatingText = ad.seller_ratings.text;
        sellerRatingImgUrl = ad.seller_ratings.rating_img_url;
        sellerRatingUrl = ad.seller_ratings.source_url;

        sellerRating = sellerRatingText.replace("{{RATING}}", "<img alt='" + ad.seller_ratings.rating + " of out 5' src='http:" + sellerRatingImgUrl + "' />");
        sellerRating = sellerRating.replace("{{LINK_START}}", "<a class='source_url' href='" + sellerRatingUrl + "'>");
        sellerRating = sellerRating.replace("{{LINK_END}}", "</a>");

        resultLink += "<p class='sellerRatings'>" + sellerRating + "</p>";
    }

    if (exists(ad.sitelinks))
    {
        resultLink += "<div class='siteLinks'>";
        if (ad.sitelinks.length > 0)
        {
            resultLink += "<ul class='col1'>";
            for (j = 0; j < ad.sitelinks.length; j = j + 2)
            {
                var click_url = buildClickUrl(ad.n, ad.sitelinks[j].url, ad.visible_url, adCount, ipaData);
                resultLink += "<li><a target='_blank' href='" + click_url + "'>" + ad.sitelinks[j].link_text + "</a></li>";
            }
            resultLink += "</ul>";
        }
        if (ad.sitelinks.length > 1)
        {
            resultLink += "<ul class='col2'>";
            for (j = 1; j < ad.sitelinks.length; j = j + 2)
            {
                var click_url = buildClickUrl(ad.n, ad.sitelinks[j].url, ad.visible_url, adCount, ipaData);
                resultLink += "<li><a target='_blank' href='" + click_url + "'>" + ad.sitelinks[j].link_text + "</a></li>";
            }
            resultLink += "</ul>";
        }
        resultLink += "</div>";
    }

    resultLink += "</li>";
    return resultLink;
}

//build click url
function buildClickUrl(destUrl, rank, displayUrl, sponsoredCount, ipaData)
{
    var url = "http://js.hotkeys.com/click?mode=ipa";
    url += "&tu=" + encodeURIComponent(destUrl);
    url += "&r=" + encodeURIComponent(rank);
    url += "&d=" + encodeURIComponent(ipaData.data.domainName);
    url += "&a=" + encodeURIComponent(ipaData.data.adNetworkID);
    url += "&thid=" + encodeURIComponent(ipaData.data.themeID);
    url += "&sid=" + encodeURIComponent(ipaData.data.sid);
    url += "&st=" + encodeURIComponent(ipaData.data.searchTerm);
    url += "&vip=" + encodeURIComponent(ipaData.data.vipIP);
    url += "&rid=" + encodeURIComponent(ipaData.data.requestID);
    url += "&spc=" + encodeURIComponent(sponsoredCount);
    url += "&slr=" + encodeURIComponent(ipaData.data.termRank);
    url += "&du=" + encodeURIComponent(stripHTML(displayUrl));
    url += "&ref=" + encodeURIComponent(ipaData.data.ref);

    return url;
}

//clean value
function cleanValue(input)
{
    if (!exists(input))
        return "";
    if (input.indexOf("'") != -1)
        return input.Replace("'", "\'");
    else
        return input;
}

//strip html markup from string
function stripHTML(old)
{
    var newStr = "";
    var inTag = false;
    for (var i = 0; i < old.length; i++)
    {
        if (old.charAt(i) == "<")
            inTag = true;
        if (old.charAt(i) == ">")
        {
            if (old.charAt(i + 1) == "<")
            {
            }
            else
            {
                inTag = false;
                i++;
            }
        }
        if (!inTag)
            newStr += old.charAt(i);
    }
    return newStr;
}

//does object exist?
function exists(x)
{
    if (typeof (x) == 'undefined')
        return false;
    if (x == null)
        return false;
    if (x === '')
        return false;
    return true;
}

//set cookie
function setCookie(name, value)
{
    var argumentCount;
    var argumentValues;
    var domain;
    var expires;
    var path;
    var secure;

    argumentValues = setCookie.arguments;
    argumentCount = setCookie.arguments.length;

    expires = (argumentCount > 2) ? argumentValues[2] : null;
    path = (argumentCount > 3) ? argumentValues[3] : null;
    domain = (argumentCount > 4) ? argumentValues[4] : null;
    secure = (argumentCount > 5) ? argumentValues[5] : false;

    document.cookie = name + '=' + escape(value) +
        ((expires == null) ? '' : ('; expires=' + expires.toGMTString())) +
        ((path == null) ? '' : ('; path=' + path)) +
        ((domain == null) ? '' : ('; domain=' + domain)) +
        ((secure == true) ? '; secure' : '');
}

//get cookie
function getCookie(name)
{
    var argument;
    var argumentLength;
    var cookieLength;
    var endString;
    var i;
    var j;

    argument = name + '=';
    argumentLength = argument.length;
    cookieLength = document.cookie.length;
    i = 0;
    while (i < cookieLength)
    {
        j = i + argumentLength;
        if (document.cookie.substring(i, j) == argument)
        {
            endString = document.cookie.indexOf(';', j);
            if (endString == -1)
                endString = document.cookie.length;
            return unescape(document.cookie.substring(j, endString));
        }
        i = document.cookie.indexOf(' ', i) + 1;
        if (i == 0)
            break;
    }
    return (null);
}

//delete cookie
function deleteCookie(name)
{
    var cookieValue;
    var expirationDate;

    expirationDate = new Date();
    expirationDate.setTime(expirationDate.getTime() - 1);

    cookieValue = getCookie(name);
    if (cookieValue != null)
        setCookie(name, '', expirationDate, '/');
}

//fetches web results via call to parking interface and renders to AFS_JS page
function fetchWebResults(ipaData)
{
    //build request
    var requestUrl = "http://js.hotkeys.com/interface/6/?mode=wr&outputType=json&jsonWrapper=renderWebResults"
         + "&dn=" + encodeURIComponent(ipaData.data.domainName)
         + "&st=" + encodeURIComponent(ipaData.data.searchTerm)
         + "&num=10"
         + "&ia=" + encodeURIComponent(ipaData.data.isAdult)
         + "&cip=" + encodeURIComponent(ipaData.data.clientIP)
         + "&ref=" + encodeURIComponent(ipaData.data.ref)
         + "&ua=" + encodeURIComponent(navigator.userAgent);

    //add script
    var script = document.createElement("script");
    script.setAttribute("type", "text/javascript");
    script.setAttribute("src", requestUrl);
    scriptsNode.appendChild(script);
}

//renders web results
function renderWebResults(webResults)
{
    //have web results?
    if ((webResults) && (webResults.webResults) && (webResults.webResults.length > 0))
    {
        //find output div
        var div = document.getElementById("ipa_wr");
        if (div)
        {
            //daughter window?
            var dw = " target='_blank'";

            //write header
            var html = "<h2>Web Results</h2>";

            //open list
            html += "<ul>";

            //loop through web results
            for (var i = 0; i < webResults.webResults.length; i++)
            {
                //determine link class
                var linkClass = "";
                if (i == 0)
                    linkClass += "first";
                else if (i == (webResults.webResults.length - 1))
                    linkClass += "last";
                html += "<li class='" + linkClass + "'>";

                //build click url
                var clickUrl = buildClickUrl(webResults.webResults[i].clickUrl, i + 1, webResults.webResults[i].displayUrl, 10, ipaDataG);

                //title
                html += "<a class='title'" + dw + " href='" + clickUrl + "' " + ">" + webResults.webResults[i].title + "</a>";

                //abstract
                html += "<p class='abstract'>" + webResults.webResults[i].abs + "</p>";

                //url
                html += "<a class='url'" + dw + " href='" + clickUrl + "'>" + webResults.webResults[i].displayUrl + "</a>";

                html += "</li>";
            }
            html += "</ul>";
            div.innerHTML = html;
        }
    }
}

//get landing html
function getLandingHtml(ipaData)
{
    var body = "";
    body += "<div class='ipa_landing'>\r\n";

    body += "  <div class='rs'>\r\n";
    body += "    <div class='ipa_rs_header'><span>Related Searches:</span></div>\r\n";
    body += "    <div id='ipa_rs_links' class='ipa_rs_links'></div>\r\n";
    body += "  </div>\r\n";

    body += "</div>\r\n";

    return body;
}

//get results html
function getResultsHtml(ipaData)
{
    var body = "";
    body += "<div id='ipa_results'>\r\n";

    body += "  <div class='ipa_rs'>\r\n";
    body += "    <div class='ipa_rs_header'><span>Related Searches:</span></div>\r\n";
    body += "    <div id='ipa_rs_links' class='ipa_rs_links'></div>\r\n";
    body += "  </div>\r\n";

    body += "  <div class='ipa_sl'>\r\n";
    body += "    <div id='ipa_sr' class='ipa_sr'></div>\r\n";
    body += "    <div id='ipa_wr' class='ipa_wr'></div>\r\n";
    body += "  </div>\r\n";

    body += "</div>\r\n";

    return body;
}

buildBody();
