var q_default_text = "enter keyword(s), then click on any cloud link";

function load()
{
    init_cookie();

    //gotcha: this function NEEDS to run prior
    // to the event.observe calls, not sure why.
    insertSiteData();
    $('q').observe('keypress', onTextKeypress);  // onTextKeypress defined in main.html.erb
    //$('q').observe('blur', onQBlur);
    //
    init_searchbox();
    init_bookmarks();
    init_make_this_my_homepage();
    show_help_message();
}
function show_help_message() {
//    alert(Cookie.getData("help_message_count"));
    var cnt = Cookie.getData({name: GLOBAL_COOKIE_NAME},"hm");
    if ( (cnt == null) || (cnt == undefined)) { cnt = 0; }
    if (cnt < 5 ) {
	$("div_welcome_info").style.visibility = "visible";
	$("div_welcome_info2").style.visibility = "visible";
	cnt+= 1;
	Cookie.setData({name: GLOBAL_COOKIE_NAME},"hm",cnt);
    }
//    alert(cnt);
}
function init_searchbox()
{
    setfocus('q');
    $('q').value = q_default_text;
    $('q').observe('click', onQClick);
}
function init_bookmarks() {
    //   toggle_bookmarks($("lnkToggleBookmarks"));
    //   alert('asdf');
    ajax_load_bookmarks();
    if(Cookie.getData({name: GLOBAL_COOKIE_NAME},"tb")=="visible")
    {
	toggle_bookmarks($("lnkToggleBookmarks"));
    }
}
function init_cookie()
{
    domain = ".";
    arr = document.domain.split(".");
    for(var i = 1;i<arr.length;i++)
    {
	domain += arr[i] + ".";
    }
    domain = domain.substring(0,domain.length - 1 );

    SC_COOKIE_NAME = "sc_{0}".format($("searchcloud_id").value);

    Cookie.initialize({name: SC_COOKIE_NAME, expires: 1000, domain: domain });
    Cookie.setData({name: SC_COOKIE_NAME}, "sc_id", $("searchcloud_id").value);
}
function hp(o) {
    o.innerHTML = "drag this link onto your browser's \"Home\" button";
    return false;
}

function init_make_this_my_homepage() {
    var html = "";
    if(Prototype.Browser.IE) {
        html =  '<a class="main_menu_link" href="javascript:history.go(0)"  onClick="';
        html += "this.style.behavior='url(#default#homepage)';this.setHomePage('{0}');".format(g_homepage);
        html += '">make this my homepage</a>';
    }
    else
    {
        html = '<a class="main_menu_link" href="{0}" onclick="javascript:return hp(this);">Make this my home page</a>'.format(g_homepage);
    }
    $("span_makethismyhomepage").innerHTML = html
    //    alert(html);
}
function onQClick()
{
    if($('q').value == q_default_text) { $('q').value = ""; }
}
function setfocus(a_field_id) {
    $(a_field_id).focus()
}

var INFO_ON_ENTER_THRESHOLD = 2;
/* end focus section */
function onTextKeypress(event)
{
    if(this.value.length==0) { return; }
    if(this.value == q_default_text) { this.value = ""; return }
    if (Event.KEY_RETURN == event.keyCode) {
	var cnt = Cookie.getData({name: GLOBAL_COOKIE_NAME},"ec");
//	alert(cnt);
	if ( (cnt == null) || (cnt == undefined)) { cnt = 0; }
        dft = defaultSiteData();
	if(cnt < INFO_ON_ENTER_THRESHOLD ) { 
	    alert("Your default search engine has been set to {0}. To change this, go to 'set preferences'.".format(dft.url));
	}
	cnt+=1;
	Cookie.setData(null,"ec",cnt);
        cloud_onclick(null,$('searchcloud_div_{0}'.format(dft.id)), dft.url,dft.qs);
    }
    return;
}
/*
sitedata is an embedded json data object, assumed to exist here
*/
function defaultSiteData()
{
    for(var  i=0;i<sitedata.length;i++){
        if(sitedata[i].isdefault == true){
            return sitedata[i];
        }
    }
    return sitedata[0];
}
addLoadEvent(load);

//places all the clouds on the page
function insertSiteData()
{
    stylecloud_pos({name: SC_COOKIE_NAME});
    Cookie.initialize();
    for(var i = 0;i<sitedata.length;i++)
    {
        //important - matches id embedded in page, and in cookie
        html_id = 'searchcloud_div_{0}'.format(sitedata[i].id);

        cook = Cookie.getData(null,sitedata[i].id);
        if(cook!=undefined) {
            x = cook['l']; //left
            y = cook['t']; //top
        }
        else
        {
            x = sitedata[i].x;
            y = sitedata[i].y;
        }

        search_count = find_searchcount(sitedata[i].id);

        fs = stylecloud_fontsize(sitedata[i],search_count);
        opacity = stylecloud_opacity(sitedata[i],search_count);
//	alert(opacity);
	style = 'font-size:{0}px;opacity: {1};filter: alpha(opacity = {2});'.format(fs , opacity, opacity * 100);
//	if(i%10==0)alert(style);
        inner_tag_html =
            tag('div'
                ,[ attr('onclick','javascript:cloud_onclick(event,this,"{0}","{1}","{2}");'.format(sitedata[i].url,sitedata[i].qs,sitedata[i].qs_default))
                   ,attr('onmouseover','javascript:cloud_onmouseover(event, this);')
                   ,attr('onmouseout','javascript:cloud_onmouseout(event, this);')
		   ,attr('onmousedown','javascript:cloud_onmousedown(event, this);')
		   ,attr('ix',i)
                   ,attr('style',style)
		   ,attr('class',"inner_cloud")
                 ]
                , '{0}'.format(sitedata[i].display_name)
                //, '{0},{1},{2},{3}'.format(i,x,y,sitedata[i].display_name)
               );
        tag_html = $(html_id);
        tag_html.setStyle({left:'{0}%'.format(x),
                           top:'{0}%'.format(y)});
        tag_html.innerHTML += inner_tag_html;
//	document.body.innerHTML += inner_tag_html;
        new Draggable(html_id,{
            onStart:draggable_onstart,
            onDrag:function(){},
            onEnd:draggable_onend,
            ghosting: false,
            scroll: false
        });

    }
}


/*
//
//  Styling the clouds
//
//
*/
function sqrd(n)
{
    return Math.pow(n,2);
}
function sqrt(n)
{
    return Math.sqrt(n);
}

//assumes embedded sitedata object exists
//calculates x,y attribute for each sitedata object in the array

function stylecloud_pos()
{
    var pos = [[53,73],[34,18],[40,9],[22,10],[44,22],[51,48],[23,59],[37,45],[21,21],[18,34],[20,44],
               [41,77],[57,58],[81,68],[76,42],[75,20],[84,37],[83,24],[65,17],[57,22],[70,64],[31,67],[74,84],
               [18,50],[19,29],[56,82],[81,49],[77,78],[65,46],[21,65],[30,82],[39,28],[40,58],[41,66],[18,72],
               [71,27],[71,9],[20,76],[21,79],[65,74],[83,12],[43,86],[72,33],[59,29],[55,12],[31,53]];


    //sort pos such that bigger is closest to x=50%,y=40%
    pos = pos.sort(function (a,b) {
        a_ = Math.abs(a[0] - 50) + Math.abs(a[1] - 40);
        b_ = Math.abs(b[0] - 50) + Math.abs(b[1] - 40);
        if ( a_ == b_ )
        { return 0; }
        else if ( a_ > b_)
        { return  1; }
        else
        { return  -1; }
    }
                  );
    x_slide = 1;
    y_slide = -5;

    for(var i = 0;i<sitedata.length;i++)
    {
        x = pos[i%pos.length][0] + x_slide;
        y = pos[i%pos.length][1] + y_slide;
        sitedata[i].x = x;
        sitedata[i].y = y;
    }
}
function stylecloud_opacity(site,searchcount)
{
    return 0.4 + (searchcount.search_count*4/100);
}

function stylecloud_fontsize(site, searchcount)
{
    orbit = (search_count.totalsites - searchcount.search_count_rank) / search_count.totalsites ;
    ret =  (13 + (orbit * 18));
    //    alert(ret);
    return ret;
}

/*
//
// CLOUD GUI events
//
*/

function draggable_onstart(el)
{
    el = el.element;
}
function draggable_onend(el)
{
    //IE hax
    //    nt = normalize_coordinate(el.element.style.top,'top');
    //    nl = normalize_coordinate(el.element.style.left,'left');

    //    drag_deltas[2] = nl;
    //    drag_deltas[3] = nt;
    //    drag_deltas[4] = el.left_x;
    //    drag_deltas[5] = el.top_y;
    //    drag_delta_y = Math.abs(nt - el.top_y);
    //    drag_delta_x = Math.abs(nl - el.left_x);

    el.element.style.top = "{0}%".format(el.top_percentage);
    el.element.style.left = "{0}%".format(el.left_percentage);
    scid = el.element.id.replace(/searchcloud_div_/gi,'');
    Cookie.setData({name: SC_COOKIE_NAME},scid, {l: Math.round(el.left_percentage), t: Math.round(el.top_percentage)});
    return true;
}
function cloud_onmouseout(event,obj) {
    obj.style.fontWeight="normal";
    $('q').style.backgroundColor = 'white';
}
function cloud_onmouseover(event,obj) {
    obj.style.fontWeight="bold";
    if(!isSearchQueryBlank()){
        $('q').style.backgroundColor = '#FFFF99';
    }
    Event.stop(event);
}
var drag_delta_x = 0;
var drag_delta_y = 0;
var drag_deltas = [0,0,0,0];
function cloud_onmousedown(event) {
    //   alert( normalize_coordinate(Event.pointerY(event),'top' ) );
    //    alert(normalize_coordinate(Event.pointerX(event),'left'));
    //    alert(normalize_coordinate(Event.pointerY(event),'top' ));

    drag_deltas[0] = Event.pointerX(event);
    drag_deltas[1] = Event.pointerY(event);
    //    alert(drag_deltas);
}
function cloud_onclick(event,obj, url,qs,qs_default)
{
    if( qs_default== "null"){
	qs_default = "";
    }
 //   alert(qs_default);
    if(event!=null) {
	drag_deltas[2] = Event.pointerX(event);
	drag_deltas[3] = Event.pointerY(event);
	//    alert(_drag_flag);
	//    alert(drag_deltas);
	drag_delta_x = Math.abs(drag_deltas[0] - drag_deltas[2]);
	drag_delta_y = Math.abs(drag_deltas[1] - drag_deltas[3]);
	drag_deltas = [0,0,0,0];
	//    alert("{0},{1}".format(drag_delta_x,drag_delta_y));
	if((drag_delta_x > 1) || (drag_delta_y > 1))
	{ return false; }
    }
    search_query = '';
    //alert(qs.indexOf("{0}"));
    if(isSearchQueryBlank())
    {
        querystring = qs_default;
    }
    else
    {
        search_query = $('q').value
        querystring = qs;
    }

    var geoip_city = $('hdn_city').value;
    var geoip_country_name = $('hdn_country_name').value;
    var geoip_country_code = $('hdn_country_code').value;
    var geoip_region = $('hdn_region').value;
    var target = "";
    var target_template =  "";

    if(geoip_city=="all" || geoip_city=="unknown") { geoip_city = "" }
    if(geoip_country_name=="all" || geoip_country_name=="unknown") { geoip_country_name = "" }
    if(geoip_region=="all" || geoip_region=="unknown") { geoip_region = "" }
    if(geoip_country_code=="all" || geoip_country_code=="unknown") { geoip_country_code = "" }

    target_template = "http://" + url + querystring;
    target_template = target_template.gsub(/\{\:city\}/,geoip_city);
    target_template = target_template.gsub(/\{\:region\}/,geoip_region);
    target_template = target_template.gsub(/\{\:country\}/,geoip_country_name);

    target = target_template.format(search_query);
    //alert(target_template);
    //alert(target);
    if(g_open_new_window) {
        window.open(target);
    }
    else {
        document.location = target;
    }
    track_query(obj);
}



/*


AJAX calls

*/

function track_query(divObj)
{
    sitedata_ix = divObj.getAttribute('ix');
    if(sitedata_ix==null) { return;}
    sd = sitedata[sitedata_ix];
    //alert(sd.id);
    //return;
    new Ajax.Request('/search',
                     {
                         method:'post',
                         parameters: {
                             searchcloud_id: $('searchcloud_id').value
                             ,site_id: sd.id
                             ,search_term: $('q').value},
                         onSuccess: function(transport) {
                             ;
                         },
                         onFailure: function(transport)    {
                             //alert('Could not contact the server {0}'.format(transport.responseText));
                         }}
                    );
}


/*

helper functions

*/

// assumes embedded json object search_counts exists.
function find_searchcount(site_id)
{
    for(var i=0;i<search_counts.length;i++){
        if(search_counts[i].id == site_id){
            return search_counts[i];
        }
    }
    return null;
}
function isSearchQueryBlank()
{
    isBlank = new RegExp("^\s*$");
    search_query = $('q').value;
    return (isBlank.test(search_query) || (search_query  == q_default_text));
}

