
var cal_settings = {}

function reset_calendar_settings()
{
cal_settings.use_personal_portal = false;
cal_settings.cal_year =  new Date().getFullYear();
cal_settings.cal_month = new Date().getMonth();
cal_settings.cal_day = new Date().getDate();
cal_settings.display_range = 1;
cal_settings.country_id = null;
cal_settings.province_id = null;
cal_settings.field_id = null;
cal_settings.audience_id = null;
cal_settings.relevance_id = 3;
}

reset_calendar_settings()

var de_DE = "de_DE"
var en_US = "en_US"

var lang = ""

monthnames_german = new Array("Januar", "Februar", "M&auml;rz", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember");

monthnames_english = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");

noresult_german = "Sie haben die Darstellung des Wissenschaftskalenders zeitlich, geografisch oder thematisch so weit eingeschr&auml;nkt, dass keine Veranstaltung die von Ihnen gew&uuml;nschten Eigenschaften erf&uuml;llt.";

noresult_english = "No results are displayed as you have chosen a too restrictive selection";

daynames_german = new Array("Mo", "Di", "Mi", "Do", "Fr", "Sa", "So");

daynames_english = new Array("Mo", "Tu", "We", "Th", "Fr", "Sa", "Su");

navline_german = '<a class="Link" onclick="change_month(-1)">< Vormonat</a> | <a class="Link" onclick="change_month(1)">Folgemonat ></a>';
navline_english = '<a class="Link" onclick="change_month(-1)">< Prev. month</a> | <a class="Link" onclick="change_month(1)">Next Month ></a>';

range_german = "<table><tr><td>" + 
'<form name="display_range" onClick="update_display_range()"><select name="range">' +
'<option value="1">1 Tag</option>' +
'<option value="3">3 Tage</option>' +
'<option value="7">1 Woche</option>' +
'<option value="14">2 Wochen</option>' +
'<option value="28">4 Wochen</option>' +
'<option value="42">6 Wochen</option>' +
'<option value="56">8 Wochen</option>' +
'</select></form>' + '</td> <td>anzeigen</td></tr>' +
'<tr><td colspan="2"><a class="Link" onclick="reset_calendar()">Auswahl zur&uuml;cksetzen</a></td></tr></table>';

range_english = '<table><tr><td>Display:</td><td> ' + 
'<form name="display_range" onClick="update_display_range()"><select name="range">' +
'<option value="1">1 day</option>' +
'<option value="3">3 days</option>' +
'<option value="7">1 week</option>' +
'<option value="14">2 weeks</option>' +
'<option value="28">4 weeks</option>' +
'<option value="42">6 weeks</option>' +
'<option value="56">8 weeks</option>' +
'</select></form></td><td>display</td></tr>' + 
'<tr><td colspan="2"><a class="Link" onclick="reset_calendar()">reset selection</a></td> </tr></table>';

function get_dayofweek_for_date(year, month, day) 
  {
    d = new Date(year,month,day)
    return d.getDay()
  };

function date_to_datetime_start(year, month, day) 
  {
    return year + "-" + (month<10?"0":"") + month + "-" + (day<10?"0":"") + 
    day + " 00:00:00"
  };

function date_to_datetime_end(year, month, day) 
  {
    var end_date = new Date(year, month - 1, (Number(day) + cal_settings.display_range-1))
    var d =  end_date.getFullYear() + "-" + 
      ((end_date.getMonth()+1)<10?"0":"") + (end_date.getMonth()+1) + "-" + 
      (end_date.getDate()<10?"0":"") + end_date.getDate() + " 23:59:59";
    return d;
  };

function increment_calendar(increment) 
  {
    cal_settings.cal_month += increment;
    if (cal_settings.cal_month > 11)  
      {
        cal_settings.cal_month = 0;
        cal_settings.cal_year = Number(cal_settings.cal_year) + 1;
      }
    else if (cal_settings.cal_month < 0)
      {
        cal_settings.cal_month = 11;
        cal_settings.cal_year -= 1;
      }
  };

function calendar_html() 
  {
    var today = new Date()
    var day_of_week = 0
    var num_lines = 0
    var cell_class = ""
    var bucket = "<table class=\"Calendar\">\n"
    bucket += "<tr>\n"
    for (d=0;d<=6;d++) 
      {
        // Generate day names
        bucket += "<th>" + daynames[d] + "</th>"
      }
    bucket += "</tr>\n<tr>"
    // generate  "empty" cells
    var dow = get_dayofweek_for_date(cal_settings.cal_year, 
                                     cal_settings.cal_month, 1);
    if (dow == 0) dow += 7;
    for (ed=1;ed<dow;ed++) 
      {
        bucket += "<td>&nbsp;</td>\n"
      }
    for (day=1;day<=31;day++)
      {
        cell_class = ""
        day_of_week = get_dayofweek_for_date(cal_settings.cal_year, cal_settings.cal_month, day)
        if ((day_of_week == 0) || (day_of_week == 6)) 
          {
            if ((today.getDate()==day) && (today.getMonth()==cal_settings.cal_month) && 
	        (today.getFullYear()==cal_settings.cal_year)) 
              {
                cell_class += ' class="Link CurrentDay Weekend"'
              } else {
                cell_class += ' class="Link Weekend"'
              }
          }
        else if ((today.getDate()==day) && 
	         (today.getMonth()==cal_settings.cal_month) && 
	         (today.getFullYear()==cal_settings.cal_year)) 
          {
            cell_class += ' class="Link CurrentDay"'
          }
	else
	  {
	    cell_class += ' class="Link"';
	  }
        bucket += '<td' + cell_class + 
	  '><a onClick="set_calendar_day('+ day + ')">';
	if ((location.pathname.split("/").reverse()[0] == 'calendar') &&
	    (cal_settings.cal_day <= day) && 
	    (day < cal_settings.cal_day + cal_settings.display_range))
	  {
	    bucket += "<b>" + day + "</b>";
	  }
	else
	  {
	    bucket += day; 
	  }
	bucket += '</a></td>\n';
        if (new Date(cal_settings.cal_year, 
	             cal_settings.cal_month, 
		     (day + 1)).getMonth() != cal_settings.cal_month) 
          {
            var last_day_of_week = day_of_week;
            break;
          }
        if (day_of_week == 0) 
          {
            bucket += "</tr><tr>\n";
            num_lines += 1;
          }
      } // end for
    // close table
    if (day_of_week != 0)
      {
        for (ed=last_day_of_week;ed <= 6; ed ++)
          {
            bucket += "<td>&nbsp;</td>\n"
          }
      }
    while (num_lines <5)
      {
        bucket += "</tr><tr><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td><td>&nbsp;</td>";
        num_lines += 1;
      }
    bucket += "</tr></table>\n"
    return bucket
  }

function init_search_form()
  {
    document.side_calendar_search.usepersonalportal.onchange = 
      new Function('update_use_personal_portal()');
    scs = document.side_calendar_search;
    document.side_calendar_search.month.onchange = 
      new Function('update_calendar_month()');
    document.side_calendar_search.year.onchange = 
      new Function('update_calendar_year()');
    document.side_calendar_search.country_id.onchange = 
      new Function('update_calendar_country()');
    document.side_calendar_search.province_id.onchange = 
      new Function('update_calendar_province()');
    document.side_calendar_search.audience_id.onchange = 
      new Function('update_calendar_audience()');
    document.side_calendar_search.field_id.onchange = 
      new Function('update_calendar_field()');
    document.side_calendar_search.relevance_id.onchange = 
      new Function('update_calendar_relevance()');
    document.side_calendar_search.removeChild(
      document.side_calendar_search.search_submit);
    document.side_calendar_search.relevance_id.options[0] = null;
  };


function test_xmlhttp()
{
  try {
    // Hold XMLHTTP object
    var XO = false;
    /*@cc_on @*/
    /*@if (@_jscript_version >= 5)
    try 
      {
        XO = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (exc) {
        try 
	  {
            XO = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (exc_2) {
            XO = false;
          }
      }
    @end @*/

    if (!XO && typeof XMLHttpRequest != 'undefined') 
      {
        XO = new XMLHttpRequest();
      }
    XO.open("GET", "/images/redarrow.gif", true);
    XO.send(null);
      }
  catch (iee)
    {
    return false;
    }
  return true;
};

function init_calendar(langin) 
{
if (test_xmlhttp())
  {
    lang = langin
    if (lang == 'de_DE') 
      {
        monthnames = monthnames_german;
        daynames = daynames_german;
        navline = navline_german;
        range = range_german;
	noresult = noresult_german;
      } else {
        monthnames = monthnames_english;
        daynames = daynames_english;
        navline = navline_english;
        range = range_english;
	noresult = noresult_english;
      }
    load_calendar_settings()
    if (document.getElementById('calendar_navline')) 
      document.getElementById('calendar_navline').innerHTML = navline;
    var servlet_name = location.pathname.split("/").reverse()[0]
    if (servlet_name == 'calendar') 
      {
        document.getElementById('current_events').innerHTML = range;
        init_search_form()
      }
    update_calendar()
  }
};

function get_index(options, value)
  {
    var i = 0;
    for (o=0;o<options.length; o++)
      {
        if (options[o].value && options[o].value == value) i = o;
      }
    return i;
  };

function reset_calendar()
  {
    reset_calendar_settings();
    update_calendar();
  };

function update_calendar_table_days()
  {
    var servlet_name = location.pathname.split("/").reverse()[0]
    if (document.getElementById('calendar_month'))
    if (servlet_name == 'calendar') 
      {
        if (lang == 'de_DE') 
          { 
            document.getElementById('calendar_month').innerHTML= 
              "ab dem " + cal_settings.cal_day + "." + (cal_settings.cal_month + 1) + "." + cal_settings.cal_year;
          }
        else 
          {
            document.getElementById('calendar_month').innerHTML= 
              "as of " + monthnames[cal_settings.cal_month] + " " + cal_settings.cal_year;
          }
      } else {
        if (lang == 'de_DE') 
          { 
            document.getElementById('calendar_month').innerHTML= 
              "im " + monthnames_german[cal_settings.cal_month] + " " + cal_settings.cal_year;
          }
        else 
          {
            document.getElementById('calendar_month').innerHTML= 
              "in " + monthnames_english[cal_settings.cal_month] + " " + cal_settings.cal_year;
          }
      }

    if (document.getElementById('calendar_table'))
      document.getElementById('calendar_table').innerHTML = calendar_html();

  };

function update_selectlists()
  {
    document.side_calendar_search.usepersonalportal.checked = cal_settings.use_personal_portal;
    document.side_calendar_search.month.selectedIndex = cal_settings.cal_month;
    document.side_calendar_search.year.selectedIndex = cal_settings.cal_year - 1998;
    document.side_calendar_search.country_id.selectedIndex = get_index(document.side_calendar_search.country_id.options, (cal_settings.country_id == null)?'any':cal_settings.country_id)
    document.side_calendar_search.province_id.selectedIndex = get_index(document.side_calendar_search.province_id.options, (cal_settings.province_id == null)?'any':cal_settings.province_id)
    document.side_calendar_search.field_id.selectedIndex = get_index(document.side_calendar_search.field_id.options, (cal_settings.field_id == null)?'any':cal_settings.field_id)
    document.side_calendar_search.audience_id.selectedIndex = get_index(document.side_calendar_search.audience_id.options, (cal_settings.audience_id == null)?'any':cal_settings.audience_id)
    document.side_calendar_search.relevance_id.selectedIndex = get_index(document.side_calendar_search.relevance_id.options, (cal_settings.relevance_id == null)?'3':cal_settings.relevance_id)
    document.display_range.range.selectedIndex = get_index(document.display_range.range.options, cal_settings.display_range)
  };

function update_calendar_table() 
  {
    update_calendar_table_days();
    var servlet_name = location.pathname.split("/").reverse()[0]
    if (servlet_name == 'calendar')
      {
        update_selectlists();
      }
  };

function change_month(increment) 
  {
    increment_calendar(increment);
    while (new Date(cal_settings.cal_year, cal_settings.cal_month, 
                    cal_settings.cal_day).getMonth() != cal_settings.cal_month) 
      {
        cal_settings.cal_day -= 1;
      }
    update_calendar();
  };

function build_request_parameters() 
  {
    abucket = new Array()
    // add day
    abucket.push("start_datetime=" + 
                 date_to_datetime_start(cal_settings.cal_year,
		                        (cal_settings.cal_month + 1),
				        cal_settings.cal_day));
    abucket.push("end_datetime=" + date_to_datetime_end(cal_settings.cal_year,
                                     (cal_settings.cal_month + 1),
				     cal_settings.cal_day));
    // add search form parameters
    if (cal_settings.use_personal_portal)
      abucket.push("usepersonalportal=True");
    if (cal_settings.country_id) 
      abucket.push("country_id=" + cal_settings.country_id);
    if (cal_settings.province_id) 
      abucket.push("province_id=" + cal_settings.province_id);
    if (cal_settings.audience_id) 
      abucket.push("audience_id=" + cal_settings.audience_id);
    if (cal_settings.field_id) 
      abucket.push("field_id=" + cal_settings.field_id);
    if (cal_settings.relevance_id) 
      abucket.push("relevance_id=" + cal_settings.relevance_id);
    // return concatenated string
    return abucket.join("&");
  };

function update_use_personal_portal()
  {
    cal_settings.use_personal_portal = document.side_calendar_search.usepersonalportal.checked;
    update_calendar();
  };

function update_calendar_country()
  {
    cal_settings.country_id = (document.side_calendar_search.country_id.value != 'any')?Number(document.side_calendar_search.country_id.value):null;
    update_calendar();
  };

function update_calendar_province()
  {
    cal_settings.province_id = (document.side_calendar_search.province_id.value != 'any')?Number(document.side_calendar_search.province_id.value):null;
    update_calendar();
  };

function update_calendar_audience()
  {
    cal_settings.audience_id = (document.side_calendar_search.audience_id.value != 'any')?Number(document.side_calendar_search.audience_id.value):null;
    update_calendar();
  };

function update_calendar_field()
  {
    cal_settings.field_id = (document.side_calendar_search.field_id.value != 'any')?Number(document.side_calendar_search.field_id.value):null;
    update_calendar();
  };

function update_calendar_relevance()
  {
    cal_settings.relevance_id = (document.side_calendar_search.relevance_id.value != 'any')?Number(document.side_calendar_search.relevance_id.value):3;
    update_calendar();
  };

function set_calendar_day(newday)
  {
    load_calendar_settings();
    cal_settings.cal_day = Number(newday);
    save_calendar_settings();
    var servlet_name = location.pathname.split("/").reverse()[0]
    if (servlet_name != 'calendar')
      {
        //location.replace("calendar");
        location = "calendar";
      }
    update_calendar();
  };

function update_calendar_year()
  {
    cal_settings.cal_year = Number(document.side_calendar_search.year.value)
    while (new Date(cal_settings.cal_year, cal_settings.cal_month, 
                    cal_settings.cal_day).getMonth() != cal_settings.cal_month) 
      {
        cal_settings.cal_day -= 1;
      }
    update_calendar();
  };

function update_calendar_month()
  {
    cal_settings.cal_month = document.side_calendar_search.month.selectedIndex;
    while (new Date(cal_settings.cal_year, cal_settings.cal_month, 
                    cal_settings.cal_day).getMonth() != cal_settings.cal_month) 
      {
        cal_settings.cal_day -= 1;
      }
    update_calendar();
  };

function update_display_range()
  {
    cal_settings.display_range = Number(document.display_range.range.value);
    update_calendar()
  };

function save_calendar_settings()
  {
    document.cookie = "cal_settings=" + JSON.stringify(cal_settings);
  };

function parse_cookies()
  {
    var cookies = {}
    var cookie
    var c_s = document.cookie.split("; ")
    for (c in c_s)
      {
	cookie = c_s[c].split('=')
	cookies[cookie[0]] = cookie[1]
      }
    return cookies
  };

function load_calendar_settings()
  {
  if (parse_cookies().cal_settings)
    {
      cal_settings = JSON.parse(parse_cookies().cal_settings)
    }
  };

function update_calendar()
  {
    update_calendar_table();
    var servlet_name = location.pathname.split("/").reverse()[0]
    if (servlet_name == 'calendar' && location.search.length==0)
      {
        reload_calendar();
      }
        save_calendar_settings();
        load_calendar_settings();
  };


function reload_calendar() 
  {
    // Hold XMLHTTP object
    var XO = false;
    /*@cc_on @*/
    /*@if (@_jscript_version >= 5)
    try 
      {
        XO = new ActiveXObject("Msxml2.XMLHTTP");
      } catch (exc) {
        try 
	  {
            XO = new ActiveXObject("Microsoft.XMLHTTP");
          } catch (exc_2) {
            XO = false;
          }
      }
    @end @*/

    if (!XO && typeof XMLHttpRequest != 'undefined') 
      {
        XO = new XMLHttpRequest();
      }
    XO.open("GET", "calendarcontent?" +  build_request_parameters(), false);
    XO.send(null);
    var txt=XO.responseText;
    if (!txt || txt.length == 0)
      {
        txt = noresult;
      }
    // replace content of "content" with received text
    document.getElementById('content').innerHTML=txt
  };

/* **********************************************************************
JavaScript code for the 'dynamic' function (mostly the new form system)
********************************************************************** */
/* Init of the page - called when the page is ready */
idw.init_dyn_page = function(lang)
{
  /* Do stuff that needs to be done for the dynamic page/forms */
  idw.lang = lang;
  idw.replace_static_with_dynamic_content();
  idw.yui_onload();
};

/* Hack for cleaning up behind the iframe hack for file uploads */
idw.cleanup_history = function(name)
{
    var hist_diff = history.length-idw.form_data[name.substr(16)].history_length;
    /* pathetic try to remove the iframe history from the page history */
    history.go(-hist_diff);
};

/* General validator for the 'new' forms. 
The 'new' style of forms doesn't submit complete form pages. Therefore the Form
state can be inconsistent. To tell the user what needs to be fixed, we try to
give the user a feedback not only after updates but also after page changes. 
This function is triggered on such events and 'only' askes the server to 
validate the currently submitted data.
 */
idw.validate_form = function(name, obj_type)
{
  var va_dict = {'name': name,  'lang': idw.lang, 'value': ""};
  $.post("/objects/" + obj_type + "/validate_form", JSON.stringify(va_dict), idw.update_field_value_callback, "json");
  return true;
};

/* To allor for page function even when JavaScript is disabled or filtered, 
the displayed forms are regular HTML forms. If we have JavaScript (Otherwise
we wouldn't be here!) we hide the submit buttons and replace the static file 
upload fields with a JavaScript uploader. */
idw.replace_static_with_dynamic_content = function()
{
    /* File upload forms */
     $("div[name='fileupload_div']").each(function (l_id) {
      this.innerHTML = '<IFRAME width="100%" frameborder="0" src="/objects/upload_file?id=' + this.id.substr(16) + '"></IFRAME>';
      idw.form_data[this.id.substr(16)] = {'history_length': history.length};
    });
    /* Image upload forms */
     $("div[name='imageupload_div']").each(function (l_id) {
      this.innerHTML = '<IFRAME width="100%" height="300px" frameborder="0" src="/objects/upload_image?id=' + this.id.substr(16) + '"></IFRAME>';
      idw.form_data[this.id.substr(16)] = {'history_length': history.length};
    });
  /* Remove submit buttons that are not needed in the JavaScript mode */
  $("input[name='state']").each(function(l_id) {
    if ((this.id.length > 0) && ("cancel done save".indexOf(this.id) != -1)) this.style.display = "none";
    });
};

/* Called for init stuff that needs to run on page load. */
idw.yui_onload = function()
{
    /* Set the active tabs to the first one - some browsers don't show the 
       form at all if it isn't explicitly selected. */
    for (i in idw.tabs) idw.tabs[i].selectTab(0);

};

/* Currently unused - useful? */
idw.xcheck_field_length = function(field_id, notarea_id, lower_limit, upper_limit, max_limit)
{
 //strlen = document.getElementById(field_id).value.length;
 var fid = "input#" + field_id;
 var inpelem = $(fid);
 var nid = "#" + notarea_id;
 var not_area = $(nid);
 var strlen = 3; /*$(fid).attr(textLength);*/
 $(fid).css("border","3px solid red");
 alert(fid);
 if (strlen < lower_limit)
    { color = "";}
 else if (strlen < upper_limit)
    { color = "#80FF80";}
 else if (strlen < max_limit)
    { color = "#FFFF80";}
 else 
    { color = "#FF0000";}
 inpelem.css('backgroundColor', color);
 not_area.text(strlen);
};

/* Color the background of a text field when the user reaches certain string 
length limits. Also display the number of characters for this field. */
idw.check_field_length = function(field_id, notarea_id, lower_limit, upper_limit, max_limit)
{
 strlen = document.getElementById(field_id).value.length;
 if (strlen < lower_limit)
    { color = "";}
 else if (strlen < upper_limit)
    { color = "#FFFF80";}
 else if (strlen < max_limit)
    { color = "#FF8040";}
 else 
    { color = "#FF0000";}
 document.getElementById(field_id).style.backgroundColor = color;
 document.getElementById(notarea_id).innerHTML = strlen;
};

/* Update the value of a field on the server when the user changes the value.
Read the value (depending on the type of the field) and transmit it to the 
server.
*/
idw.update_field_value = function(field_id, field_name, obj_type, lang)
{
  inpelem = document.getElementById(field_id);
  /* Checkboxes and radiobuttons need a special type of handling. */
  if (inpelem.type == 'checkbox')
    {
        var values = [];
        var nodename = inpelem.name;
        var namednodes = document.getElementsByName(nodename);
        for (var i=0;i<namednodes.length;i++)
          {
            if(namednodes[i].type=='checkbox')
              {
                if(namednodes[i].checked)
                  {
                    values.push(namednodes[i].value);
                  }
              }
          }
       var ivalue = values;
    }
  else if (inpelem.type == 'radio')
    {
        var ivalue = [];
        var nodename = inpelem.name;
        var namednodes = document.getElementsByName(nodename);
        for (var i=0;i<namednodes.length;i++)
          {
            if(namednodes[i].type=='radio')
              {
                if(namednodes[i].checked)
                  {
                    ivalue = [namednodes[i].value];
                  }
              }
          }
    }
  else 
    {
        /* All other types of field can be just asked for their value. */
        var ivalue = inpelem.value;
    };
  var ud_dict = {'name': field_name,  'value': ivalue, 'lang': lang};

  /* alert(JSON.stringify(ud_dict)); */
  
  $.post("/objects/" + obj_type + "/update_field_data", JSON.stringify(ud_dict), idw.update_field_value_callback, "json");
};

/*  Callback for the update value function.
This callback updated the preview and the error areas of the form.
*/
idw.update_field_value_callback = function(data_in, status)
{
    var data = data_in['data'];
    /* Get the error message area for the field */
    var emarea = document.getElementById("form_errormessage_" + data['name']);
    if ('errortext' in data) 
        {
            emarea.innerHTML = data['errortext'];
            emarea.style.display = 'block';
        }
    else
        {
            emarea.innerHTML = '';
            emarea.style.display = 'none';
        }
    /* Update the "global" validation error messages for the form. */
    if ('validationerrors_texts' in data)
        {
            document.getElementById("validationerrors_area").style.display = "block";
            var bucket = ""
            for (var l in data['validationerrors_texts'])
                {
                    bucket += "<li>" + data['validationerrors_texts'][l] + "</li>";
                }
            document.getElementById("validationerrors_list").innerHTML = bucket;
        }
    else
        {
            document.getElementById("validationerrors_area").style.display = "none";
        }
    /* Update the preview area. */
    if ('preview' in data) 
    {
        /* Usually a simple 'innerHTML replace' should habe been enough. 
        But with IE that only worked once as just replacing the node didn't 
        really replace all the node IDs of it. So we need to explicitly 
        remove the preview area and recreate the div. IEeeeeeeeeeeeeee */
        var pw = data['preview'];
        var dn = document.getElementById("preview_area");
        while (dn.hasChildNodes()) dn.removeChild(dn.childNodes[0]);
        var ndiv = document.createElement("div");
        ndiv.innerHTML = pw;
        dn.appendChild(ndiv);
    };
};


/* **********************************************************************
Code for user feedback functionality 

This uses the objects URL of the objectcontroller to get the overlay Form
and to submit the individual votes back to the server.
********************************************************************** */

/* We need the idw namespace to be set up and everything the feedback does goes
into the user_feedback sub-namespace. */
idw.user_feedback = {};
idw.user_feedback.question_stars = {};
idw.user_feedback.question_star_response = {};

/* Display a YUI Dialog panel and trigger loading the form from the server */
idw.user_feedback.show_user_feedback_panel = function(document_type, document_id, lang)
{
    var overlay = new YAHOO.widget.Dialog("feedback_overlay", 
              { fixedcenter:true, 
                visible:false, 
                width:"400px",
                postmethod: "none",
                close: false, 
                constraintoviewport : true
                 } ); 
    if (lang=='de_DE') /* Display this now - don't wait for server response */
      {
        overlay.setBody("Bitte warten ... ");
        overlay.setHeader("Ihre Bewertung");
      }
    else
      {
        overlay.setBody("Please wait ... ");
        overlay.setHeader("Your vote");
      }
    /* overlay.setFooter("End"); -- don't use footer now */
    overlay.render(document.body);
    overlay.show();
    /* Keep a handle to the overlay in the user_feedback namespace */
    idw.user_feedback.overlay = overlay;
    /* Remember the information of this document for the vote submission */
    idw.user_feedback.document_type = document_type;
    idw.user_feedback.document_id = document_id;
    idw.user_feedback.lang = lang;
    /* Prepare the request and request the form from the server */
    var ud_dict = {'document_type': document_type,  'document_id': document_id, 'lang': lang};
    $.post("/objects/" + 'feedback' + "/get_form", JSON.stringify(ud_dict), idw.user_feedback.update_user_feedback_panel_callback, "json");
};

/* **********************************************************************
Callback that displays the form in the YUI Dialog panel 
This is also used to set up the path to the star images (needed on submission)
********************************************************************** */
idw.user_feedback.update_user_feedback_panel_callback = function(data_in, status)
{
    var data = data_in['data'];
    if ('empty_star_path' in data)
    {
        idw.user_feedback.empty_star_path = data.empty_star_path;
    }
    else
    { /* If for some reason we should not habe the correct response,
         put something sensible in as default. */
        idw.user_feedback.empty_star_path = "/images/stars/GrayStar.png";
    }
    if ('full_star_path' in data)
    {
        idw.user_feedback.full_star_path = data.full_star_path;
    }
    else
    {
        idw.user_feedback.empty_star_path = "/images/stars/OrangeStar.png";
    }
    if ('overlay_form' in data) 
    { /* This replaced the 'please wait' in the dialog with the form. */
        idw.user_feedback.overlay.setBody(data.overlay_form);
        /* This next block sets up convenience handlers to the stars. */
        for (var qid=1; qid<=3; qid++)
          {
            idw.user_feedback.question_stars[qid] = {};
            for (var s=1; s<=5; s++)
              {
                idw.user_feedback.question_stars[qid][s] = document.getElementById('idw_uf_star_' + qid + '_' + s);
              }
            idw.user_feedback.question_star_response[qid] = document.getElementById('idw_uf_star_result_' + qid);
          }
    };
};

/* This Function is called by the 'onclick' handler of the stars. 
It updates the stars (change color) and send the vote to the server. */
idw.user_feedback.rate = function(question_id, vote)
{
    /* Iterate 'out' star line and set either full or empty stars, 
       depending on the vote. */
    for (var i = 1; i<=5; i++)
      {
        if (i <= vote)
          {
            idw.user_feedback.question_stars[question_id][i].src= idw.user_feedback.full_star_path;
          }
        else
          {
            idw.user_feedback.question_stars[question_id][i].src= idw.user_feedback.empty_star_path;
          };
      };
    /* Send the vote to the server */  
    var ud_dict = {'document_type': idw.user_feedback.document_type,  
                   'document_id': idw.user_feedback.document_id, 
                   'lang': idw.user_feedback.lang, 
                   'question_id': question_id, 
                   'vote': vote};
    $.post("/objects/" + 'feedback' + "/update_field_data", JSON.stringify(ud_dict), idw.user_feedback.update_user_feedback_rating_callback, "json");
};

/* This function is called by the onchange handler of the text area.
It sends the comment to the server. */
idw.user_feedback.setcomment = function(question_id, comment_id)
{
    comment_value = document.getElementById(comment_id).value;
    var ud_dict = {'document_type': idw.user_feedback.document_type,  
                   'document_id': idw.user_feedback.document_id, 
                   'lang': idw.user_feedback.lang, 
                   'question_id': question_id, 
                   'comment': comment_value};
    $.post("/objects/" + 'feedback' + "/update_field_data", JSON.stringify(ud_dict), idw.user_feedback.update_user_feedback_rating_callback, "json");
};

/* Callback for the vote and comment server requests. Does nothing currently. */
idw.user_feedback.update_user_feedback_rating_callback = function(data_in, status)
{
    var data = data_in['data'];
    if (('response_string' in data) && ('question_id' in data)) 
      {
        qid = data.question_id;
        idw.user_feedback.question_star_response[qid].innerHTML = data.response_string;
      }
};

/* Callback for the vote and comment server requests. Does nothing currently. */
idw.user_feedback.closewindow = function()
{
  idw.user_feedback.overlay.hide();
  location.reload();  
};


