var modes_file = "index1.php", actions_file = "index2.php",
 default_container = "content", current_page = {mode: "", page: 0};

function add_editors(form)
{
 var forms = form ? [form] : document.forms, element, id;
 for (var i = 0; i < forms.length; i++)
  for (var j = 0; j < forms[i].elements.length; j++)
  {
   element = forms[i].elements[j];
   switch (element.className)
   {
    case 'date_editor':
     Calendar.setup({ inputField: element, ifFormat: "%Y-%m-%d %H:%M:%S", showsTime: true, cache: true, showOthers: true });
     element.className += '_';
    break;
    case 'text_editor':
     id = element.id || (element.id = "tiny_mce_" + rand(1, 999999));
     tinyMCE.execCommand('mceAddControl',false,id);
     element.className += '_';
    break;
   }
  }
 return false;
}

function remove_editors(form)
{
 var forms = form ? [form] : document.forms, element, id;
 for (var i = 0; i < forms.length; i++)
  for (var j = 0; j < forms[i].elements.length; j++)
  {
   element = forms[i].elements[j];
   if (element.className == 'text_editor_' && (id = element.id))
    tinyMCE.execCommand('mceRemoveControl',false,id);
  }
 return false;
}

function open_page(get, post, win, onsuccess, onerror)
{
 var container;
 if (win && (container = win.get_element("content")))
  win.current_page = get;
 else
 {
  container = $(default_container);
  current_page = get;
 }
 load_url(modes_file + (get ? "?" + url_encode_array(get) : ""), url_encode_array(post), container,
  function(request)
  {
   add_editors();
   if (onsuccess) onsuccess(request);
  }, onerror);
 return false;
}

function open_new_page(get, post, onsuccess, onerror)
{
 var w = new jswindow();
 if (get.mode) w.set_caption(get.mode);
 w.get_element("buttons").childNodes[0].innerHTML = "<img src=\"files/images/window-close.gif\" alt=\"Close\" border=\"0\" />";
 open_page(get, post, w, function(request) {
  w.center();
  if (onsuccess) onsuccess(request);
 }, onerror);
 w.center();
 return false;
}

function popup_my_window(title, get, post, onsuccess, onerror)
{
 var w = new my_jswindow();
 w.get_element("buttons").childNodes[0].innerHTML = "<img src=\"files/images/window-close.gif\" alt=\"Close\" border=\"0\" />";
 load_url(get, post, w.get_element("content"), function(request) {
  w.center(); w.set_caption(title);
  if (onsuccess) onsuccess(request);
 }, onerror);
 w.center();
 return false;
}

function refresh_page(variables, win, onsuccess, onerror)
{
 var page;
 if (win)
 {
  if (variables)
   for (var i in variables)
    win.current_page[i] = variables[i];
  open_page(win.current_page, null, win, onsuccess, onerror);
 }
 else
 {
  if (variables)
   for (var i in variables)
    current_page[i] = variables[i];
  open_page(current_page, null, null, onsuccess, onerror);
 }
 return false;
}

function edit_record(get, post, win, onsuccess, onerror)
{
 if (win && win.current_page)
  for (var i in win.current_page)
   if (typeof get[i] == "undefined")
    get[i] = win.current_page[i];
 var w = new jswindow();
 w.parent = win;
 if (get.mode) w.set_caption(get.mode);
 w.get_element("buttons").childNodes[0].innerHTML = "<img src=\"files/images/window-close.gif\" alt=\"Close\" border=\"0\" />";
 load_url(actions_file + (get ? "?" + (typeof get == "object" ? url_encode_array(get) : get) : ""),
  typeof post == "object" ? url_encode_array(post) : post,
  w.get_element("content"), function(request) {
  w.center();
  add_editors();
  if (onsuccess) onsuccess(request);
 }, onerror);
 w.center();
 return false;
}

function delete_record(get, post, win, onsuccess, onerror)
{
 if (win && win.current_page)
  for (var i in win.current_page)
   if (typeof get[i] == "undefined")
    get[i] = win.current_page[i];
 if (confirm("Delete this item?"))
 {
  ajax_request({
   url: actions_file + (get ? "?" + (typeof get == "object" ? url_encode_array(get) : get) : ""),
   post: typeof post == "object" ? url_encode_array(post) : post,
   onsuccess: function(request) {
    refresh_page(null, win);
    if (request.responseText) alert(request.responseText);
    if (onsuccess) onsuccess(request);
   },
   onerror: function(request) {
    alert("Error " + request.status + ": " + request.statusText);
    if (onerror) onerror(request);
   }
  });
 }
 return false;
}

function save_form(form, onsuccess, onerror)
{
 var w = get_parent_window(form);
 var c = w && w.get_element("content") || form.parentNode;
 remove_editors(form);
 submit_form(form, c, function(request) {
  if (w)
  {
   c = c && c.innerHTML || "";
   w.close();
   if (c) alert(c);
   else refresh_page(null, w = w && w.parent, function() { if (w) w.center(); });
  }
  if (onsuccess) onsuccess(request);
 }, onerror);
 w.center();
 return false;
}

function format_price(value, integer)
{
 return round(floatval(value), integer ? 0 : 2).toFixed(integer ? 0 : 2).replace(/(\d)(?=(\d{3})+([^\d]|$))/g, "$1&nbsp;");
}

function count_words(text, length)
{
 if (!length) length = 1;
 text = text.split(/\s+/);
 var words = 0;
 for (i = 0; i < text.length; i++)
  if (text[i].length >= length)
   words++;
 return words;
}

function switch_order_type(form, simple)
{
 function switch_row(element, visible)
 {
  while (element && element.nodeName != "TR")
   element = element.parentNode;
  if (element)
   if (visible) show(element);
   else hide(element);
 }
 if (form.elements.length)
 {
 var category = form.elements.category.value, pricelist, servicelist;
 var type = (form.elements.type.value.split('-'))[0];
 if (category == "essay")
 {
  pricelist = essay_pricelist;
  servicelist = essay_servicelist;
  switch (intval(type))
  {
   case 0: // essay
   case 1: // dissertation
    //switch_row(form.elements.spacing, true);
    switch_row(form.elements.pages, true);
    switch_row(form.elements.text, false);
    switch_row(form.elements.summary, true);
    switch_row(form.elements.sources, true);
   break;
   case 2: // formatting
   case 3: // editing
   case 4: // proofreading
    //set_select_value(form.elements.spacing, 2);
    //switch_row(form.elements.spacing, false);
    switch_row(form.elements.pages, false);
    switch_row(form.elements.text, true);
    switch_row(form.elements.summary, false);
    switch_row(form.elements.sources, false);
   break;
  }
 }
 else if (category == "resume")
 {
  pricelist = resume_pricelist;
  servicelist = resume_servicelist;
  if (pricelist[type]["page"])
  {
   switch_row(form.elements.pages, true);
  }
  else
  {
   set_select_value(form.elements.pages, 1);
   switch_row(form.elements.pages, false);
  }
 }
 set_table_classes($("personal_information"), ["tr1", "tr2"]);
 set_table_classes($("paper_information"), ["tr1", "tr2"]);
 var v = form.elements.urgency.value;
 set_select_options(form.elements.urgency, pricelist[type]["urgencies"]);
 set_select_value(form.elements.urgency, v);
 v = form.elements.level.value;
 set_select_options(form.elements.level, pricelist[type]["levels"]);
 set_select_value(form.elements.level, v);
 if (!simple) calculate_price(form);
}
}

function count_order_pages(form)
{
 var spacing = intval(form.elements.spacing.value);
 var text = form.elements.text.value;
 var words = count_words(text, 3);
 var pages = Math.ceil(words / (2 / spacing * 300));
 set_content($("words_and_pages"), words + " word" + (words != 1 ? "s" : "") + ", " + pages + " page" + (pages != 1 ? "s" : ""));
 set_select_value(form.elements.pages, pages || 1);
 //calculate_price(form);
}

function calculate_price(form)
{
 var category = form.elements.category.value, pricelist, servicelist;
 var type = (form.elements.type.value.split('-'))[0];
 switch (category)
 {
  case "essay":
   pricelist = essay_pricelist;
   servicelist = essay_servicelist;
   if (in_array([2, 3, 4], type)) count_order_pages(form);
  break;
  case "resume":
   pricelist = resume_pricelist;
   servicelist = resume_servicelist;
  break;
 }
 var urgency = intval(form.elements.urgency.value);
 var level = intval(form.elements.level.value);
 var spacing = intval(form.elements.spacing.value) == 2 ? 1 : 2;
 var currency = form.elements.currency.value;
 var rate = floatval(form.elements.rate.value);
 var pages = intval(form.elements.pages.value);
 var services = 0, l = servicelist.length;
 if (category == "resume")
  for (var i = 0; i < pricelist.length; i++)
   for (var j = 0; j < pricelist[i]["types"].length; j++)
    set_content($("price_" + i + "_" + j), format_price(round((pricelist[i]["prices"][urgency][level] + pricelist[i]["page"] * pages * spacing) * rate, 2)) + " " + currency);
 for (var i = 0; i < l; i++)
 {
  var p = round(floatval(servicelist[i].price) * rate, 2);
  if ((l > 1 ? form.elements["services[]"][i] : form.elements["services[]"]).checked) services += p;
  set_content($("service" + i + "_price"), p ? format_price(p) + " " + currency : "FREE");
 }
 var language = form.elements.language[0].checked ? 1 : 1.05;
 switch (category)
 {
  case "essay":
   var price = round(pricelist[type]["prices"][urgency][level] * spacing * rate, 2);
   set_content($("page_price"), price ? format_price(price) + " " + currency : "&minus;");
   set_content($("total_price"), price ? format_price(round((price * pages + services) * language, 2)) + " " + currency : "&minus;");
  break;
  case "resume":
   var price = round((pricelist[type]["prices"][urgency][level] + pricelist[type]["page"] * pages * spacing) * rate, 2);
   set_content($("total_price"), price ? format_price(round((price + services) * language, 2)) + " " + currency : "&minus;");
  break;
 }
}

function update_price_calculator(form, switch_type)
{
 var category = form.elements.category.value, pricelist, servicelist;
 switch (category)
 {
  case "essay":
   pricelist = essay_pricelist;
   servicelist = essay_servicelist;
  break;
  case "resume":
   pricelist = resume_pricelist;
   servicelist = resume_servicelist;
  break;
 }
 var type = intval(form.elements.type.value);
 if (switch_type)
 {
  var v = form.elements.urgency.value;
  set_select_options(form.elements.urgency, pricelist[type]["urgencies"]);
  set_select_value(form.elements.urgency, v);
  v = form.elements.level.value;
  set_select_options(form.elements.level, pricelist[type]["levels"]);
  set_select_value(form.elements.level, v);
 }
 var urgency = intval(form.elements.urgency.value);
 var level = intval(form.elements.level.value);
 var spacing = intval(form.elements.spacing.value) == 2 ? 1 : 2;
 var currency = form.elements.currency ? form.elements.currency.value : '$';
 var rate = form.elements.rate ? floatval(form.elements.rate.value) : 1;
 var pages = intval(form.elements.pages.value);
 switch (category)
 {
  case "essay":
   var price = round(pricelist[type]["prices"][urgency][level] * spacing * rate, 2);
   set_content($("sidebar_page_price"), price ? format_price(price) + " " + currency : "&minus;");
   set_content($("sidebar_total_price"), price ? format_price(round(price * pages, 2)) + " " + currency : "&minus;");
   set_content($("essay_total_price"), price ? format_price(round(price * pages, 2)) + " " + currency : "&minus;");
  break;
  case "resume":
   var price = round((pricelist[type]["prices"][urgency][level] + pricelist[type]["page"] * pages * spacing) * rate, 2);
   set_content($("sidebar_total_price"), price ? format_price(round(price, 2)) + " " + currency : "&minus;");
  break;
 }
}

function make_table(attributes, cells)
{
 var result = "<table";
 if (attributes)
  for (var a in attributes)
   result += " " + a + "=\"" + attributes[a] + "\"";
 result += ">\n";
 if (cells)
  for (var r = 0; r < cells.length; r++)
  {
   result += " <tr>\n";
   for (var c = 0; c < cells[r].length; c++)
    result += "  <td>" + cells[r][c] + "</td>\n";
   result += " </tr>\n";
  }
 result += "</table>";
 return result;
}

function calculate_prices(form)
{
 var category = form.elements.category.value, pricelist, servicelist;
 switch (category)
 {
  case "essay":
   pricelist = essay_pricelist;
   servicelist = essay_servicelist;
  break;
  case "resume":
   pricelist = resume_pricelist;
   servicelist = resume_servicelist;
  break;
 }
 var type = intval(form.elements.type.value);
 var spacing = intval(form.elements.spacing.value) == 2 ? 1 : 2;
 var currency = form.elements.currency.value;
 var rate = floatval(form.elements.rate.value);
 var pages = intval(form.elements.pages.value);
 var urgencies = pricelist[type].urgencies, levels = pricelist[type].levels, prices = pricelist[type].prices;
 var table = [], r = 0, c = 0;
 table[0] = ["<strong>Academic level / Timeframe</strong>"];
 for (var i in levels)
  table[0].push("<span class=\"orange\">" + levels[i] + "</span>");
 for (var i in urgencies)
 {
  r++; c = 0;
  table[r] = ["<span class=\"right\">" + urgencies[i] + "</span>"];
  for (var j in levels)
  {
   c++;
   table[r][c] = prices[i][j] ? format_price(prices[i][j] * pages * rate) + "&nbsp;" + currency : "&minus;";
  }
 }
 set_content($("essay_calculator"), make_table({"id": "table_essay_calculator", "class": "table_price", "border": "0", "width": "100%", "style": "border-collapse:collapse"}, table));
 set_table_classes($("table_essay_calculator"), ["tr1", "tr2"]);
}

function verify_order_form(form)
{
 var fields = get_fields(form), required = ["firstname", "lastname", "email1", "phone1", "topic"], ok = true;
 for (var i in required)
  if (!fields[required[i]])
  {
   ok = false;
   add_class(form.elements[required[i]], "error");
  }
 if (fields["password"] != fields["confirm"])
 {
  ok = false;
  add_class(form.elements["confirm"], "error");
 }
 if (!ok) alert("Please fill all required fields");
 return ok;
}

function update_payment_amount(form)
{
 var r = floatval(form.elements.rate.value),
  b = round(floatval(form.elements.bonus.value), 2),
  p = round(floatval(form.elements.price.value), 2),
  f = round(floatval(form.elements.free.value), 2);
 if (f < 0) f = 0; else
 if (f > b) f = b;
 if (form.elements.free.value && floatval(form.elements.free.value) != f)
  form.elements.free.value = f;
 p = round(p - f, 2);
 set_content($("free_amount"), round(f * r, 2));
 set_content($("payment_amount"), round(p * r, 2));
 form.elements.submit.disabled = p ? true : false;
 if (document.forms.swreg)
 {
  document.forms.swreg.elements.vp.value = p;
  for (var i in document.forms.swreg.elements)
   if (document.forms.swreg.elements[i].type == "submit")
    document.forms.swreg.elements[i].disabled = !p;
 }
 if (document.forms.plimus)
 {
  document.forms.plimus.elements.overridePrice.value = p;
  for (var i in document.forms.plimus.elements)
   if (document.forms.plimus.elements[i].type == "submit")
    document.forms.plimus.elements[i].disabled = !p;
 }
 return false;
}

function plagiarism_check(id, key)
{
 var f = document.forms.form_plagiarism;
 if (f && confirm("Now you will be redirected to our partners' plagiarism checking site.\n" +
  "Please copy and paste your paper text in the provided form.\n" +
  "If you have checked this paper before, you can view it's statistics.\n" +
  "Continue?"))
 {
  f.elements.essay_id.value = id;
  f.elements.key.value = key;
  f.submit();
 }
return false;
}

function filter_search_string(s)
{
 var allow = " !'()*+,-./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~", char, result = "";
 for (var i = 0; i < s.length; i++)
 {
  char = s.charAt(i);
  if (allow.indexOf(char) >= 0)
  {
   if (char == ' ' || char == '/') char = '+';
   result += char;
  }
 }
 return result;
}

var sidebar;
add_event(window,"load",function(){if(e$('sidebar'))sidebar = new floatSideBar$('sidebar','main-wrap',{dh:250,dt:10});});

var d$ = document;
function e$(id){return e$$(d$,id)}
function e$$(e,id){return e.getElementById(id)||null}
function scrollTop$(){return self.pageYOffset||(d$.documentElement&&d$.documentElement.scrollTop)||(d$.body&&d$.body.scrollTop)}

function floatSideBar$(id,p,o)
{ var sender=this;
  this.e=e$(id),this.p=e$(p),this.v={dh:0,dt:0},this.heigth=this.p.offsetHeight;//-100;

  this.init=function(o)
  { for(s in o)this.v[s]=o[s];
    add_event(window,"scroll",function(){sender.action()});
    add_event(window,"resize",function(){sender.action()});
    this.action();
  }
  this.action=function()
  { var st=scrollTop$();
    if(st+this.v.dt<=this.v.dh)
    { this.e.style.position='static';
      this.e.style.marginTop='0px';
      this.e.style.top='auto';
    }
    else if(this.v.dh+this.heigth>st+this.e.offsetHeight+this.v.dt)
    { this.e.style.position='fixed';
      this.e.style.marginTop='0px';
      this.e.style.top=this.v.dt+'px';
	  this.e.style.marginLeft='-8px';
    }
    else
    { this.e.style.position='static';
      this.e.style.marginTop=(this.heigth-this.e.offsetHeight)+'px';
      this.e.style.top='auto';
    }
  }
  this.init(o||{});
}

function live_chat(chats)
{
 var me = this, active = [], load_listeners = [], update_listeners = [];
 
 this.online = function()
 {
  return active.length;
 }
 
 this.open = function(n)
 {
  if (typeof n == "undefined")
   n = active.length ? active[0] : 0;
  if (chats[n])
   window["ps" + chats[n].id + "ow"]();
 }
 
 this.open_random = function()
 {
  var n;
  if (arguments.length)
  {
   for (var i = 0; i < arguments.length; i++)
    if ((i + 1) in active && Math.random() * 100 <= arguments[i])
     n = i + 1;
  }
  else if (active.length)
   n = active[Math.floor(Math.random() * (active.length + 1))];
  me.open(n);
 }
 
 this.onload = function(f)
 {
  if (typeof f != "function") return
  for (var i in load_listeners)
   if (load_listeners[i] == f) return;
  load_listeners.push(f);
  if (active.length) f(chats, active);
 }
 
 this.onupdate = function(f)
 {
  if (typeof f != "function") return
  for (var i in update_listeners)
   if (update_listeners[i] == f) return;
  update_listeners.push(f);
  //if (active.length) f(chats, active);
 }
 
 this.remove = function(f)
 {
  for (var i in load_listeners)
   if (load_listeners[i] == f)
    load_listeners.splice(i, 1);
  for (var i in update_listeners)
   if (update_listeners[i] == f)
    update_listeners.splice(i, 1);
 }
 
 this.status = function()
 {
  var loaded = false;
  for (var i in chats)
   if (typeof window["ps" + chats[i].id + "ol"] != "undefined")
    loaded = true;
  if (!loaded) return false;
  active = [];
  for (var i in chats)
   if (window["ps" + chats[i].id + "ol"])
    active.push(i);
  return true;
 }
 
 var checks = 0, checker = setInterval(function() {
  if (checks++ < 60 && !me.status()) return;
  clearTimeout(checker);
  for (var i in load_listeners)
   load_listeners[i](chats, active);
  setInterval(function() {
   var l = active.length;
   me.status();
   if (active.length != l)
    for (var i in update_listeners)
     update_listeners[i](chats, active);
  }, 10000);
 }, 1000);
}
