// $Id:$

function StockSearch() {
    this.resultsId = "";
    this.ticker = "";
    this.selectCallback = null;
    this.defaultCallback = null;
    this.gotResultsCallback = null;
}

StockSearch.prototype.nullFn = function() {}


// http://www.quirksmode.org/blog/archives/2005/10/_and_the_winner_1.html
StockSearch.prototype.addEvent = function( obj, type, fn ) {
    if (obj.addEventListener)
        obj.addEventListener( type, fn, false );
    else if (obj.attachEvent) {
        obj["e"+type+fn] = fn;
        obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
        obj.attachEvent( "on"+type, obj[type+fn] );
    }
}

StockSearch.prototype.removeEvent = function( obj, type, fn ) {
    if (obj.removeEventListener)
        obj.removeEventListener( type, fn, false );
    else if (obj.detachEvent) {
        if (obj[type+fn]) {
            obj.detachEvent( "on"+type, obj[type+fn] );
        }
        obj[type+fn] = null;
        obj["e"+type+fn] = null;
    }
}


StockSearch.prototype.killMouseEvent = function(ev) {
    if (ev.stopPropagation) {
	ev.stopPropagation();
	ev.preventDefault();
    } else if (window.event) {
	window.event.returnValue = false;
	window.event.cancelBubble = true;
    }
}


StockSearch.prototype.tickerSearch = function(ticker, resultsId, selectCallback, defaultCallback, gotResultsCallback) {
    this.ticker = ticker;
    this.resultsId = resultsId;
    this.selectCallback = selectCallback;
    this.defaultCallback = defaultCallback;
    this.gotResultsCallback = gotResultsCallback;
    var url = "/x/stocksearch?s="+encodeURI(ticker);
    this.loadXML(url);
}

StockSearch.prototype.loadXML = function(url) {
    // show waiting text
    var resultsElem = document.getElementById(this.resultsId);
    resultsElem.innerHTML = "<img src=\"/img/wait.gif\" alt=\"\"> Searching ...";
    
    // search request
    try {
         var _this = this;
        if (window.XMLHttpRequest) {
            this.xmlhttp = new XMLHttpRequest();
            this.xmlhttp.onreadystatechange = function() { _this.xmlhttpStateChange();}
            this.xmlhttp.open("GET", url, true);
            this.xmlhttp.send(null);
        } else if (window.ActiveXObject) {
            // code for IE
            this.xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            if (this.xmlhttp) {
                this.xmlhttp.onreadystatechange = function() { _this.xmlhttpStateChange();}
		this.xmlhttp.open("GET",url,true);
		this.xmlhttp.send();
            }
        }
    } catch (e) {
        //alert("error retrieving chart details\r\n(" + e + ")");
        this.xmlhttp.onreadystatechange = _this.nullFn; // IE doesn't allow "null"
        this.xmlhttp = null;
    }
}

StockSearch.prototype.xmlhttpStateChange = function(url) {
    // if xmlhttp shows "loaded"
    if (this.xmlhttp.readyState==4) { // if "OK"
	if (this.xmlhttp.status==200) {
	    this.displaySearchResults(this.xmlhttp.responseText);
	} else {
	    alert("Problem retrieving XML data");
	}
	this.xmlhttp.onreadystatechange = nullFn; // IE doesn't allow "null"
	this.xmlhttp = null;
    }
}

StockSearch.prototype.displaySearchResults = function(jsonRaw) {
    var resultsElem = document.getElementById(this.resultsId);
    resultsElem.innerHTML = "";

    if (-1 != jsonRaw.indexOf("ERROR:")) {
        resultsElem.innerHTML = jsonRaw;
    } else {
        // Eval JSON response into variable 
        var jsonContent = eval("(" + jsonRaw + ")");
        if (this.gotResultsCallback) {
            this.gotResultsCallback(jsonContent.stocks.length);
        }

        if (jsonContent.stocks.length > 0) {
            var rFrag = document.createDocumentFragment();
            var rlist = document.createElement("ul");
            rFrag.appendChild(rlist);
            for (var i=0; i<jsonContent.stocks.length; ++i) {
                var st = jsonContent.stocks[i];
                var li = document.createElement("li");
                var r = document.createElement("a");
                r.href="#";
                r.stockId = st.id;
                r.stockName = st.name;
                r.stockTicker = st.ticker;
                r.searcher = this;
                this.addEvent(r, "click", this.selectHandler)
                var rt = document.createTextNode(st.name +" ("+st.ticker+")");
                r.appendChild(rt);
                li.appendChild(r);
                rlist.appendChild(li);
            }
            resultsElem.appendChild(rFrag);

            if (this.defaultCallback && (1 == jsonContent.stocks.length)) {
                var st = jsonContent.stocks[0];
                this.defaultCallback(st.id, st.name, st.ticker);
            }
        } else {
            var p = document.createElement("p");
            p.appendChild(document.createTextNode("No stocks found"));
            resultsElem.appendChild(p);
        }
    }
}

StockSearch.prototype.selectHandler = function(e) {
    this.searcher.selectCallback(this.stockId, this.stockName, this.stockTicker); 
    this.searcher.killMouseEvent(e);
    return false;
}
