    var last_offset = "";
    var query;
    var more_connect;
    var page = 0;
    var show_conversations = new Array();
    var plurks = null;
    
    var getQueryString = function(name) {
        name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
        var regex = new RegExp("[\\?&]"+name+"=([^&#]*)");
        var results = regex.exec( window.location.href );
        if (null === results) {
        	return null;
        } else {
            return results[1];
        }
    }
    
    var renderSearchResult = function(data) {
        last_offset = data.last_offset;
        page++;
        plurks = data.plurks;
        var ol = dojo.create("ol", { className: "search-result", id: "result-page-" + page });
        dojo.forEach(plurks, function(item) {
            p = new Plurk(item, data.users[item.owner_id]);
            ol.appendChild(p.render());
        });
        dojo.byId("result").appendChild(ol);
        dojo.doc.title = query + " - Plurk Search";
        ajaxYahooCas(getPlurkMsg());//get Yahoo Cas Reports
    }

    var renderConversations = function(data, plurk_id) {
        var responses = data.responses;
        var root_plurk = dojo.byId(plurk_id);
        var ol = dojo.create("ol", { className: "search-result conversations" });
        dojo.forEach(responses, function(item) {
            p = new Plurk(item, data.friends[item.user_id]);
            ol.appendChild(p.render());
        });
        dojo.connect(root_plurk, "onclick", function() { conversationSwitch(plurk_id); });
        var close = dojo.create("li", {className: "small", innerHTML: "close"});
        dojo.connect(close, "onclick", function() { conversationSwitch(plurk_id); });
        ol.appendChild(close);
        root_plurk.parentNode.appendChild(ol);
    }
    
    var conversationSwitch = function(plurk_id) {
        var ol = dojo.query("#plurk-" + plurk_id + " > ol");
        if ("block" == ol.style("display")) {
        	ol.style("display", "none");
        } else {
        	ol.style("display", "block");
        }
    }
    
    var search = function(e) {
        dojo.stopEvent(e);
        spinning(dojo.byId("search-button"));
        dojo.byId("result").innerHTML = "";
        query = dojo.byId("query").value;
        last_offset = "";
        ajaxSearch();
    }

    var ajaxSearch = function() {
        dojo.query("#container").style("display", "block");
    	dojo.xhrGet({
            url: "search",
            content: { q: query, offset: last_offset },
            handleAs: "json",
            load: function(data, args) {
                if(typeof data == "error"){
                    console.warn("error!",args);
                } else {
                    renderSearchResult(data);
                    dojo.query("#operations").style("display", "block");
                    dojo.byId("search-button").innerHTML = "search";
                    var more = dojo.byId("more");
                    if (true === data.has_more) {
                    	more.innerHTML = "more";
                    	connectMore();
                    } else {
                    	more.innerHTML = "no more!";
                    	dojo.disconnect(more_connect);
                    }
                    dojo.query("#result-page-" + page + " span.actions").forEach(function(item){ 
                    	show_conversations[item.id] = dojo.connect(item, "onclick", function() { 
                    		ajaxConversations(item.id);
                            dojo.disconnect(show_conversations[item.id]); 
                            });
                    });
                }
            }
        });
    }
    
    var ajaxConversations = function(plurk_id) {
    	dojo.xhrGet({
            url: "conversations",
            content: { plurk_id: plurk_id },
            handleAs: "json",
            load: function(data, args) {
                if(typeof data == "error"){
                    console.warn("error!",args);
                } else {
                    renderConversations(data, plurk_id);
                }
            }
        });
    }
    //yahoo cas
    var getPlurkMsg = function() {
    	var str = "";
    	if (plurks !== null) {
    		dojo.forEach(plurks, function(item) {
    			str += item.content_raw;
    		});
    	}
    	return dojo.trim(str);
    }
    
    var ajaxYahooCas = function(content) {
    	var node = dojo.byId("related-keywords");
    	if (node.hasChildNodes()) {
    		
    	} else {
        	dojo.xhrPost({
                url: "ke",
                content: { content: content },
                handleAs: "json",
                load: function(data, args) {
                    if(typeof data == "error"){
                        console.warn("error!",args);
                    } else {
                    	if ( null !== data ) {
                        	node.appendChild(dojo.create("b", { innerHTML: "Possible related keyword:"}));
                        	dojo.forEach(data, function(item) {
                        		var str = item.token;
                        		if ( str !== query ) {
                                    element = dojo.create("a", { href: "/?q=" + str, innerHTML: str });
                            	    node.appendChild(element);
                        		}
                        	});
                    	}
                    }
                }
            });
    	}
    }
    //end yahoo cas
    var spinning = function(node) {
    	node.innerHTML = "<img src='/static/images/spinner.gif' />";
    }
    
    var connectMore = function() {
    	dojo.disconnect(more_connect);
    	more_connect = dojo.connect(dojo.byId("more"), "onclick", function() {
        	spinning(dojo.byId("more"));
            ajaxSearch();
        	dojo.disconnect(more_connect);
        });
    }
    
    dojo.addOnLoad(function(){
    	dojo.byId("query").focus();
        //dojo.connect(dojo.byId("search-form"), "onsubmit", "search");
        dojo.connect(dojo.byId("return2search"), "onclick", function() { dojo.byId("query").focus(); });
        if (null !== getQueryString("q")) {
        	spinning(dojo.byId("search-button"));
        	query = decodeURI(getQueryString("q"));
        	dojo.byId("query").value = query;
        	ajaxSearch();
        }
    }); 