var g_offset = 0;
var g_useGoogleApiFirst = false;
var g_searchTip = 'try entering someone like Paul Newman or Oprah...';
var pageTracker = null;

function handleLoad() {
    var name = self.document.location.hash.substring(1);
    name = unescape(name);
    var nameElm = document.getElementById('personName');
    nameElm.focus();
    if (name != '') {
        nameElm.value = name;
        doMakeOdd(name);
    }
}

function makeOdd() {
    output('');
    var defaultValue = 'a celebrity';
    var nameElm = document.getElementById('personName');
    var name = nameElm.value;
    if (name == defaultValue) {
        output(g_searchTip);
    }
    else {
        parent.location.hash = escape(name);
        doMakeOdd(name);
    }
    return false;
}

function doMakeOdd(name) {
    if (name != '') {
        hideElm('via');
        var jsonUrl = null;
        if (g_useGoogleApiFirst) {
            jsonUrl = 'http://ajax.googleapis.com/ajax/services/search/images?v=1.0&' +
                    'callback=makeOddCallback&imgtype=face&rsz=large&' +
                    'imgsz=large&imgc=color&q=' + encodeURIComponent(name);
        }
        else {
            jsonUrl = 'http://api.search.live.net/json.aspx?AppId=A432005841ADBE19304A63EE4421934230C424A2&' +
                'JsonType=callback&JsonCallback=makeOddCallback&Image.Count=3&&Image.Offset=0&' +
                'Market=en-us&Version=2.0&Adult=Moderate&' +
                'Image.Filters=Size:Large&Image.Filters=Face:Face&Image.Filters=Aspect:Tall&Image.Filters=Style:Photo&' +
                'Sources=Image&Query=' + encodeURIComponent(name);
        }
        performCall(jsonUrl, 'makeOddCallback');
    }
}

function makeOddCallback(data) {
    var result = null;
    var tryAlternative = false;
    var bingMinResultsToUse = 20;

    if (g_useGoogleApiFirst) {
        var maxSizeTries = 3;
        for (var i = g_offset; i <= g_offset + maxSizeTries && result == null; ++i) {
            result = data.responseData.results[i];
            if (result) {
                var proportionOk = result.height * 1.3 >= result.width * 1;
                if (!proportionOk) {
                    result = null;
                }
            }
        }
        if (!result) {
            result = data.responseData.results[g_offset];
        }
    }
    else {
        var total = data.SearchResponse.Image.Total;
        if (total >= bingMinResultsToUse && data.SearchResponse.Image.Results) {
            result = data.SearchResponse.Image.Results[g_offset];
            var sizeOk = result.Width * 1 <= 900 && result.Height * 1 <= 900;
            var fileFormatOk = ! ( result.MediaUrl.indexOf('.png') >= 1 );
            tryAlternative = !sizeOk || !fileFormatOk;
        }
        else {
            tryAlternative = true;
        }
    }

    if (!tryAlternative) {
        if (result) {
            if (g_useGoogleApiFirst) {
                flipImage(result.url, result.width, result.height, result.originalContextUrl);
                g_useGoogleApiFirst = false;
            }
            else {
                flipImage(result.MediaUrl, result.Width, result.Height, result.Url);
            }
        }
        else if (g_offset == 0) {
            g_useGoogleApiFirst = false;
            output('celebrity not found, ' + g_searchTip);
        }
    }
    else {
        g_useGoogleApiFirst = true;
        makeOdd();
    }
}

function output(s) {
    if (s != '') { alert(s); }
}

function flipImage(imageUrl, width, height, contextUrl) {
    var viaHtml = '<div class="viaInner"><a href="' + contextUrl + '" rel="nofollow">site</a></div>';
    var maxTries = 3;
    var widthOfVia = 50;

    if ( canCanvas() ) {
        var canvas = document.getElementById('canvas');
        canvas.style.visibility = 'visible';
        var ctx = canvas.getContext('2d');
        canvas.width = width;
        canvas.height = height;
    
        var img = new Image();
        img.src = imageUrl;
        img.onerror = function() {
            if (g_offset <= maxTries) {
                g_offset++;
                setTimeout('makeOdd()', 100)
            }
            else {
                g_offset = 0;
            }
        }
        img.onload = function() {
            ctx.drawImage(img, 0, 0, width, height);
            flipVertical(canvas, img, 0, 0, width / 2, height);
            var viaElm = document.getElementById('via');
            viaElm.innerHTML = viaHtml;
            viaElm.style.width = width + 'px';

            var nameElm = document.getElementById('personName');
            if (pageTracker) {
                pageTracker._trackPageview('/analytics_api/entered/' + encodeURIComponent(nameElm.value) + '/');
            }
            showElm('via');
        }
    }
    else {
        var s = '';
        s += '<div><img src="' + imageUrl + '" alt="" style="filter: fliph; display: block;" class="mainImage" /></div>';
        s += '<div style="overflow: hidden; width: ' + (width / 2) + 'px; position: relative; ' +
                'top: -' + (height * 1 + 10) + 'px; left: -' + (width / 4) + 'px">' +
                '<img src="' + imageUrl + '" alt="" /></div>';
        // s += '<div class="via" style="margin-top: -' + height + 'px">' + viaHtml + '</div>';

        var resultElm = document.getElementById('result');
        resultElm.innerHTML = s;
    }
}

function showElm(id) {
    var elm = document.getElementById('via');
    if (elm) { elm.style.display = 'block'; }
}

function hideElm(id) {
    var elm = document.getElementById('via');
    if (elm) { elm.style.display = 'none'; }
}

function canCanvas() {
    var isIE = navigator.appName.indexOf('Microsoft') != -1;
    return !isIE;
}

function flipVertical(canvas, img, left, top, width, height) {
    var copyCanvas = document.createElement('canvas');
    copyCanvas.width = width;
    copyCanvas.height = height;
    copyCanvas.getContext('2d').drawImage(img, left, top, width, height, 0, 0, width, height);

    var ctx = canvas.getContext('2d');
    ctx.scale(-1, 1);
    ctx.drawImage(copyCanvas, -left - width * 2, top, width, height);
}

function performCall(jsonUrl, callbackFunction) {
    var containerId = 'scriptContainer';
    if ( document.getElementById(containerId) ) {
        document.body.removeChild( document.getElementById(containerId) );
    }
    var script = document.createElement('script');
    script.id = containerId;
    script.type = 'text/javascript';
    script.src = jsonUrl;
    document.body.appendChild(script);
}
