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);
    element.className = 'text_editor';
   }
  }
 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);
 open_page(get, post, w, function(request) {
  w.center();
  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);
 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);
 if (w) w.center();
 return false;
}

function validate_form(form, fields, message)
{
 if (form)
 {
  if (fields)
   switch (fields.constructor)
   {
    case Array:
     for (var i = 0; i < fields.length; i++)
      if (fields[i] && form.elements[fields[i]] && !form.elements[fields[i]].value)
      {
       if (message) setTimeout(function() { alert(message); }, 10);
       return false;
      }
    break;
    case Object:
     for (var i in fields)
      if (i && fields[i] && form.elements[i])
      {
       var regexp = new RegExp(fields[i]);
       if (!regexp.test(form.elements[i].value))
       {
        if (message) setTimeout(function() { alert(message); }, 10);
        return false;
       }
      }
    break;
   }
  else
   for (var i = 0; i < form.elements.length; i++)
    if ((form.elements[i].type == "input" || form.elements[i].type == "select-one") && !form.elements[i].value)
    {
     if (message) setTimeout(function() { alert(message); }, 10);
     return false;
    }
  return true;
 }
 else return false;
}

function getElementsByClassName(class_name, tag_name, element)
{
 if (typeof class_name === 'string')
  class_name = new RegExp("(^| )" + class_name + "( |$)");
 if (!tag_name) tag_name = "*";
 if (!element) element = document;
 var elements = typeof element.getElementsByTagName != undefined ?
  element.getElementsByTagName(tag_name) : element.all || [], result = [];
 for (var i = 0; i < elements.length; i++)
  if (class_name.test(elements[i].className))
   result.push(elements[i]);
 return result;
}

function switch_spoiler(element, state)
{
 var s = element.offsetHeight, h = element.scrollHeight;
 if (s == 0 || s >= h)
 {
  var c = s, r = typeof state == "undefined" ? (s < h ? h : 0) : (state ? h : 0);
  var t = setInterval(function() {
   var n = Math.round((c * 1.5 + r * 0.5) * 0.5);
   if (n == c) n = r; c = n;
   element.style.height = c < h ? c + "px" : "";
   if (c == r) clearInterval(t);
  }, 25);
 }
 return false;
}

function start_countdown(element, time, oncomplete)
{
 var date = new Date(2000, 1, 1, 0, 0, 0, 0);
 date.setTime(date.getTime() + time * 1000);
 var t = setInterval(function() {
  date.setTime(date.getTime() - 1000);
  if (element && time > 0)
  {
   set_content(element, date.toLocaleTimeString());
   time--;
  }
  else
  {
   clearInterval(t);
   set_content(element, "&minus;");
   if (oncomplete && time == 0)
    oncomplete(element);
  }
 }, 1000);
}

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 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);
}

function payment_system_details(system, details)
{
 switch (system.value)
 {
  case "PayPal":
   if (!/paypal/i.test(details.value))
    details.value = "PayPal E-Mail:";
  break;
  case "Wire Transfer":
   if (!/wire\s*transfer/i.test(details.value))
    details.value = "Wire Transfer details:\n\n" +
    "BENEFICIARY BANK DETAILS\n" +
    " Beneficiary Name:\n" +
    " Bank Name:\n" +
    " Bank Address:\n" +
    " Bank City:\n" +
    " Bank State/Province:\n" +
    " Bank Postal/Zip Code:\n" +
    " Bank Country:\n" +
    " Bank Account or IBAN number:\n" +
    " SWIFT Code:\n" +
    " Currency Preferred:\n\n" +
    "BENEFICIARY POSTAL ADDRESS\n" +
    " Address:\n" +
    " City:\n" +
    " State/Province:\n" +
    " Postal/Zip Code:\n" +
    " Country:\n\n" +
    "INTERMEDIARY BANK DETAILS\n" +
    " Bank Name:\n" +
    " Bank Address:\n" +
    " Bank City:\n" +
    " Bank State/Province:\n" +
    " Bank Postal/Zip Code:\n" +
    " Bank Country:\n" +
    " SWIFT Code:";
  break;
 }
}

function init(get)
{
 var container = $("content"), mode = get["mode"] || "main";
 if (container)
  switch (mode)
  {
   case "free_orders":
   case "active_orders":
   case "completed_orders":
   case "messages":
   case "new_messages":
   case "statistics":
   case "payments":
   case "free_rewritings":
   case "active_rewritings":
   case "completed_rewritings":
    open_page(get, null, null, function() {
     var tables = getElementsByClassName("data_table", "TABLE", container);
     if (tables.length)
      for (var i = 0; i < tables.length; i++)
       set_table_style(tables[i], "#ffffff", "#ffffff", "#fafafa", "#fafafa");
    });
   break;
   case "profile":
    load_url(actions_file + "?mode=" + mode, "action=edit", container, function() {
     var tables = getElementsByClassName("data_table", "TABLE", container);
     if (tables.length)
      for (var i = 0; i < tables.length; i++)
       set_table_style(tables[i], "#ffffff", "#ffffff", "#fafafa", "#fafafa");
     if (document.forms["profile"])
      Calendar.setup({ inputField: document.forms["profile"].elements.birthday, ifFormat: "%Y-%m-%d", showsTime: false, cache: true, showOthers: true });
    });
   break;
   case "contacts":
    load_url(mode + "_form.php", null, $("ajax_content"));
   break;
  }
}
