
var CIE_logo_on = new Image(); CIE_logo_on.src = "http://thepowerofmyetus.com/webcpms/icons/cie/cie_logo_48x48.png";
var CIE_logo_off = new Image(); CIE_logo_off.src = "http://thepowerofmyetus.com/webcpms/icons/cie/cie_logo_gray_48x48.png";

var Myetus_logo_on = new Image(); Myetus_logo_on.src = "http://thepowerofmyetus.com/webcpms/icons/myetus/myetus_logo_88x31.png";
var Myetus_logo_off = new Image(); Myetus_logo_off.src = "http://thepowerofmyetus.com/webcpms/icons/myetus/myetus_logo_gray_88x31.png";

var months_en = new Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December");
var days_en = new Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday");

var months_hu = new Array("Január", "Február", "Március", "Április", "Május", "Június", "Július", "Augusztus", "Szeptember", "Október", "November", "December");
var days_hu = new Array("Vasárnap", "Hétfő", "Kedd", "Szerda", "Csütörtök", "Péntek", "Szombat");
var char_subst = new Array("áäéíóöőúüűÁÄÉÍÓÖŐÚÜŰđłĐŁ",
                           "aaeiooouuuAAEIOOOUUUdłDL");

var months, days;

var TimerLoginSince;
var TIMEOUT_LOGINSINCE = 60000;



function loadMenu(host) {
   var smp_hover = /\s*menu_hover/, hover = 'menu_hover';

   var g = document.getElementById(host);
   if (!g) return;
   var lg = g.getElementsByTagName("li");

   for (k = 0; k < lg.length; k++) {
      lg[k].onmouseover = function() {
         c = this.className;
         this.className = c ? c + ' ' + hover : hover;
      };
      lg[k].onmouseout = function() {
         c = this.className;
         this.className = c ? c.replace(smp_hover, '') : '';
      };
   }
}


var languages = new Array();

function Language(descr, name, english_name) {
   this.descr = descr;
   this.name = name;
   this.english_name = english_name;
}

function getLanguage(descr) {
   var i = 0;
   while (i < languages.length && languages[i].descr != descr) i++;
   return i < languages.length ? languages[i] : null;
}


function createLanguages() {
   var i = 0;
   while ( (lang_host = document.getElementById("Language_" + i)) != null ) {
      var lang = lang_host.value.split(",");
      languages[languages.length] = new Language(lang[0], lang[1], lang[2]);
      i++;
   }
   months = eval("months_" + document.getElementById('lang').value);
   days = eval("days_" + document.getElementById('lang').value);
//   char_subst = eval("char_subst_" + document.getElementById('lang').value);
}


function isModuleInstalled(module_name) {
   var installed = false;
   try {
      eval("if (engine_" + module_name + "_process != null) installed = true;");
   } catch (ex) {
   }
   return installed;
}


function getPageBase(page_url) {
   if (page_url == null) page_url = "" + window.location;

   var addr = page_url.split("?");
   var dirs = addr[0].split("/");
   var base = dirs[dirs.length - 1].length > 0 ? dirs[dirs.length - 1] : "index.php";
   return base;
}

function getWebAddress(page_url) {
   if (page_url == null) page_url = "" + window.location;

   var ds = page_url.indexOf("//");
   var e = page_url.indexOf("/", ds == -1 ? 0 : ds + 2);

   return page_url.substring(0, e == -1 ? null : e);
//   return window.location.hostname;
}


function safeString(str) {
   return encodeURIComponent(str.replace(/'/g, "%27"));
}

function unSafeString(str) {
   str = decodeURIComponent(str);
//   str = str.replace(/&amp;/g, "&");
//   str = str.replace(/&lt;/g, "<");
//   str = str.replace(/&gt;/g, ">");
   return str.replace(/%27/g, "'");
}

function safeFileName(filename, chars_to_trim) {
   if (chars_to_trim == null) chars_to_trim = ".-+";
   var res = "", i, j;
   var a1 = "a".charCodeAt(0); var z1 = "z".charCodeAt(0); var a2 = "A".charCodeAt(0); var z2 = "Z".charCodeAt(0); var n0 = "0".charCodeAt(0); var n9 = "9".charCodeAt(0); var s = "_".charCodeAt(0); var d = ".".charCodeAt(0); var e = "-".charCodeAt(0);
   filename = trim(filename, chars_to_trim);
   for (i = 0; i < filename.length; i++) {
      var chr = filename.charAt(i);
      var c = filename.charCodeAt(i);
      if ( (c >= a1 && c <= z1) || (c >= a2 && c <= z2) || (c >= n0 && c <= n9) || (c == s || c == d || c == e) ) {
         res += chr;
      } else if (chr == ' ') {
         res += "-";
      } else if (chr == '&') {
         res += "and";
      } else {
         j = 0;
         while (j < char_subst[0].length && char_subst[0].charAt(j) != chr) j++;
         if (j < char_subst[0].length) {
            res += char_subst[1].charAt(j);
         }
      }
   }
   return res;
}

function stripHTML(text, strip_all_white) {
   var i, html_tag = false, newtag = false;
   var white = strip_all_white ? " \t\r\n'\"+!%/=()~^`\|[]$<>#&@{};*?:_,.-" : " ";
   var nohtml = "";
   var text = text.replace(/&nbsp;/g, " ");
   var html_tag_name = "";
   var prev_tag_name = "";
   var is_script = false;
   for (i = 0; i < text.length; i++) {
      var c = text.charAt(i);
      if (c == ">") {
         html_tag = false;
         if (!newtag) nohtml += " ";
         newtag = true;
         continue;
      }
      if (html_tag) {
         if (white.indexOf(c) == -1) {
            html_tag_name += c;
         }
      } else {
         if (c == "<") {
            html_tag = true;
            prev_tag_name = html_tag_name;
            html_tag_name = "";
         } else {
            if (white.indexOf(c) > -1) {
               if (!newtag) nohtml += " ";
               newtag = true;
//            } else if (html_tag_name.toLowerCase().indexOf("script") == -1) {
            } else {
               newtag = false;
               nohtml += c;
            }
         }
      }
   }
   return nohtml;
}


function compact(text, num, no_ellipses) {
   if (no_ellipses == null) no_ellipses = false;
   if (text.length <= num - 1) return text;
   return text.substr(0, num) + (no_ellipses ? "" : "...");
}


function getTimeWithTZOffsets(year, month, day, hour, min, sec) {
   var tzo_server = document.getElementById('ServerTZO').value;
   var tzo_client = document.getElementById('ClientTZO').value;
   return new Date(year, month - 1, day, hour - tzo_server - tzo_client, min, sec);
}


function updateLoggedInSince(year, month, day, hour, min, sec) {
   var date = getTimeWithTZOffsets(year, month, day, hour, min, sec);
   var t = convertTime(date.getHours(), date.getMinutes());
   var curdate = new Date();
   var dif = Math.round((curdate.getTime() - date.getTime()) / 60000);
   var sh = Math.floor(dif / 60);
   var sm = dif % 60;
   var since = (sh > 0 ? sh + "h " : "") + (sm > 0 ? sm + "m" : "");
   if (sh > 12) since = "<span style='color: red;'>" + since + "</span>";
   document.getElementById("LoggedInSince").innerHTML = t + (since.length > 0 ? " (" + since + ")" : "");
}


function mailto(encoded_email) {
   var dec = encoded_email.replace(/ -at- /g, "@");
   dec = dec.replace(/ -dot- /g, ".");
   return dec;
}

function domailto(encoded_email) {
   location.href = "mailto:" + mailto(decodeURIComponent(encoded_email));
}

var DATE_AND_TIME    = 1;
var DATE_ONLY        = 2;

function parseSqlDate(sql_date, parse_rule) {
//   if (sql_date == null || sql_date == "0000-00-00" || sql_date == "0000-00-00 00:00:00") return null;
   if (sql_date == null) return null;
   if (parse_rule == null) parse_rule = DATE_AND_TIME;
   var sd = sql_date.split(" ");
   var date = sd[0].split("-");
//   var time = null;
   if (sd.length == 2) {
      time = sd[1].split(":");
      if (parse_rule == DATE_AND_TIME) {
         var d = new Date(date[0], date[1] - 1, date[2], time[0], time[1]);
      } else {
         var d = new Date(date[0], date[1] - 1, date[2]);
      }
   } else {
      var d = new Date(date[0], date[1] - 1, date[2]);
   }
//   d.setFullYear(date[0]);
//   d.setMonth(date[1] - 1);
//   d.setDate(date[2]);
//   if (time) {
//      d.setHours(time[0]);
//      d.setMinutes(time[1]);
//   }
   return d;
}

function getTimeStamp(h, m) {
   if (h instanceof Date) {
      return h.getHours() * 60 + h.getMinutes();
   } else if (m == null) {
      var sd = h.split(" ");
      if (sd.length == 2) {
         var time = sd[1].split(":");
         return time[0] * 60 + time[1] * 1;
      } else if (sd.length == 1) {
         var time = sd[0].split(":");
         if (time.length > 0) {
            return time[0] * 60 + time[1] * 1;
         }
      }
      return null;
   } else {
      return h * 60 + m * 1;
   }
   return null;
}


function getDateStamp(y, m, d) {
   if (y instanceof Date) {
      return y.getFullYear() * 10000 + (y.getMonth() + 1) * 100 + y.getDate() * 1;
   } else {
      return y * 10000 + m * 100 + d * 1;
   }
   return 0;
}


function getFullStamp(date) {
//   return getDateStamp(y, m, d) + (y instanceof Date ? getTimeStamp(y) : getTimeStamp(h, i));
   return Math.round(date.getTime() / 60000);
}

function fullStampToDate(fullstamp, format) {
   var d = new Date();
   d.setTime(fullstamp * 60000);
   return format ? formatDateTime(d, format) : d;
}


function sameDay(d1, d2) {
   return d1.getFullYear() == d2.getFullYear() && d1.getMonth() == d2.getMonth() && d1.getDate() == d2.getDate() ? true : false;
}


//function getFullTimeStamp(date) {
//   return Math.floor(date.getTime() / 60000);
//}

/*
Day
   d 	Day of the month, 2 digits with leading zeros
      01 to 31
   D 	A textual representation of a day, three letters
      Mon through Sun
   Dn *Myetus extension!*
      A textual representation of a day, n letters; n is a single digit from 0 to 9
      D1 M through S
      D2 Mo through Su etc.
   j 	Day of the month without leading zeros
      1 to 31
   l  A full textual representation of the day of the week
      Sunday through Saturday
   w 	Numeric representation of the day of the week
      0 (for Sunday) through 6 (for Saturday)
   z* 	The day of the year (starting from 0)
      0 through 365
Month
   F 	A full textual representation of a month, such as January or March
      January through December
   m 	Numeric representation of a month, with leading zeros
      01 through 12
   M 	A short textual representation of a month, three letters
      Jan through Dec
   n 	Numeric representation of a month, without leading zeros
      1 through 12
   t 	Number of days in the given month
      28 through 31
Year
   L* 	Whether it's a leap year
      1 if it is a leap year, 0 otherwise.
   Y 	A full numeric representation of a year, 4 digits
      Examples: 1999 or 2003
   y 	A two digit representation of a year
      Examples: 99 or 03
Time
   a 	Lowercase Ante meridiem and Post meridiem
      am or pm
   A 	Uppercase Ante meridiem and Post meridiem
      AM or PM
   g 	12-hour format of an hour without leading zeros
      1 through 12
   G 	24-hour format of an hour without leading zeros
      0 through 23
   h 	12-hour format of an hour with leading zeros
      01 through 12
   H 	24-hour format of an hour with leading zeros
      00 through 23
   i 	Minutes with leading zeros
      00 to 59
   s 	Seconds, with leading zeros
      00 through 59
Timezone
   O* 	Difference to Greenwich time (GMT) in hours
      Example: +0200
   Z* 	Timezone offset in seconds. The offset for timezones west of UTC is always negative, and for those east of UTC is always positive.
      -43200 through 50400
Full Date/Time
   r 	RFC 2822 formatted date
      Example: Thu, 21 Dec 2000 16:01:07 +0200
   U 	Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT)
*/

function formatDateTime(date_obj, format_string, nbsp) {
   if (date_obj == null || date_obj == "0000-00-00" || date_obj == "0000-00-00 00:00:00") return "";
   if (date_obj instanceof Date) {
      var d = date_obj;
   } else {
      var datetime = date_obj.split(" ");
      var date = datetime[0].split("-");
      var fy = date[0] * 1, fm = date[1] * 1, fd = date[2] * 1;
      if (datetime.length > 1) {
         var time = datetime[1].split(":");
         var fh = time[0] * 1, fi = time[1] * 1, fs = time[2] * 1;
         var d = new Date(fy, fm - 1, fd, fh, fi, fs);
      } else {
         var d = new Date(fy, fm - 1, fd);
      }
   }
   var fwd = d.getDay();
   fy = d.getFullYear();
   fm = d.getMonth();
   fd = d.getDate();
   if (datetime) {
      if (datetime[1]) {
         fh = d.getHours();
         fi = d.getMinutes();
         fs = d.getSeconds();
      }
   } else {
      fh = d.getHours();
      fi = d.getMinutes();
      fs = d.getSeconds();
   }
   if (format_string == null || format_string == "") {
      format_string = datetime ? (datetime.length > 1 ? "D, M d, Y h:i A" : "D, M d, Y") : "D, M d, Y";
   }

   var ret = "";

   var fmt_chrs = "dDjlwzFmMntLYyaAgGhHisOZrU";

   var i;
   for (i = 0; i < format_string.length; i++) {
      var chr = format_string.charAt(i);
      if (chr == "\\" && i < format_string.length - 1) {
         ret += format_string.charAt(++i);
      } else if (fmt_chrs.indexOf(chr) > -1) {
         switch (chr) {
            case "d":
               ret += makeTwoDigits(fd);
               break;
            case "D":
               var n = 3, nn;
               if (i < format_string.length - 1 && !isNaN( nn = format_string.charAt(i + 1) )) {
                  i++;
                  n = nn;
               }
               ret += days[fwd].substr(0, n);
               break;
            case "j":
               ret += fd;
               break;
            case "l":
               ret += days[fwd];
               break;
            case "w":
               ret += fwd;
               break;
            case "z":
               break;
            case "F":
               ret += months[fm];
               break;
            case "m":
               ret += makeTwoDigits(fm + 1);
               break;
            case "M":
               ret += months[fm].substr(0, 3);
               break;
            case "n":
               ret += (fm * 1 + 1);
               break;
            case "t":
               ret += getMaxDaysOfMonth(fm + 1, fy);
               break;
            case "L":
               break;
            case "Y":
               ret += fy;
               break;
            case "y":
               var y = "" + fy;
               ret += y.substr(2, 2);
               break;
            case "a":
               if (fh == null) {
                  ret += "";
               } else if (fh < 12) {
                  ret += "am";
               } else {
                  ret += "pm";
               }
               break;
            case "A":
               if (fh == null) {
                  ret += "";
               } else if (fh < 12) {
                  ret += "AM";
               } else {
                  ret += "PM";
               }
               break;
            case "g":
               if (fh == null) {
                  ret += "";
               } else if (fh == 0) {
                  ret += 12;
               } else if (fh > 12) {
                  ret += fh - 12;
               }
               break;
            case "G":
               if (fh == null) {
                  ret += "";
               } else {
                  ret += fh;
               }
               break;
            case "h":
               if (fh == null) {
                  ret += "";
               } else if (fh == 0) {
                  ret += 12;
               } else if (fh > 12) {
                  ret += makeTwoDigits(fh - 12);
               } else {
                  ret += makeTwoDigits(fh);
               }
               break;
            case "H":
               if (fh == null) {
                  ret += "";
               } else {
                  ret += makeTwoDigits(fh);
               }
               break;
            case "i":
               if (fi == null) {
                  ret += "";
               } else {
                  ret += makeTwoDigits(fi);
               }
               break;
            case "s":
               if (fs == null) {
                  ret += "";
               } else {
                  ret += makeTwoDigits(fs);
               }
               break;
            case "O":
               break;
            case "Z":
               break;
            case "r":
               ret += d.toString();
               break;
            case "U":
               ret += Math.round(d.getTime() / 1000);
               break;
         }
      } else {
         ret += format_string.charAt(i);
      }
   }
   return nbsp == true ? ret.replace(/ /g, "&nbsp;") : ret;
}



var NAMEFORMAT_FULL     = 1;
var NAMEFORMAT_SINGLE   = 2;
var NAMEFORMAT_SHORT    = 3;
var NAMEFORMAT_NORMAL   = 4;

function formatName(firstname, lastname, format) {
   if (firstname == null) firstname = "";
   if (lastname == null) lastname = "";
   if (format == null) format = NAMEFORMAT_SHORT;
   var name = "";
   if (firstname.length > 0 && lastname.length > 0) {
      if (format == NAMEFORMAT_SINGLE) {
         name = lastname;
      } else if (format == NAMEFORMAT_NORMAL) {
         name = firstname + " " + lastname;
      } else {
         name = lastname + ", " + (format == NAMEFORMAT_FULL ? firstname : firstname.substr(0, 1) + ".");
      }
   } else if (firstname.length > 0) {
      name = firstname;
   } else {
      name = lastname;
   }
   return name;
}




function getIconDir() {
   var icondir = "webcpms/icons/";
   var loc = "" + window.location;
   var pos = loc.indexOf("//");
   if (loc.lastIndexOf("/") == pos + 1) {
      return icondir;
   } else {
      var addr = loc.substr(pos + 2);
      var cnt = 0;
      while ( (pos = addr.indexOf("/")) > -1 && addr.length > 1 ) {
         addr = addr.substr(pos + 1);
         cnt++;
      }
      var dir = "", i;
      for (i = 0; i < cnt - 1; i++) {
         dir += "../";
      }
      dir += icondir;
   }
   return dir;
}


function makeTwoDigits(num) {
   num = "" + num;
   if (num.length < 2) return "0" + num;
   return num;
}

function convertTime(time1, time2, nbsp) {
   var hour, min;
   if (time2 == null) {
      if (time1 instanceof Date) {
         hour = time1.getHours();
         min = time1.getMinutes();
      } else {
         var datetime = time1.split(" ");
         if (datetime.length == 2) {
            var hourmin = datetime[1].split(":");
         } else {
            var hourmin = time1.split(":");
         }
         hour = hourmin[0] * 1;
         min = hourmin[1] * 1;
      }
   } else {
      hour = time1 * 1;
      min = time2 * 1;
   }
   var ampm = "";
   if (hour >= 24) hour -= 24;
      else if (hour < 0) hour += 24;
   if (hour == 0) {
      hour = 12;
      ampm = "AM";
   } else if (hour < 12) {
      ampm = "AM";
   } else if (hour == 12) {
      ampm = "PM";
   } else if (hour < 24) {
      hour -= 12;
      ampm = "PM";
   }
   return makeTwoDigits(hour) + ":" + makeTwoDigits(min) + (nbsp != null ? "&nbsp;" : " ") + ampm;
}


function get_random(min, max) {
   return Math.round(min + Math.random() * (max - min - 1));
}

function get_probability(prob) {
   return get_random(0, 100) < prob ? true : false;
}

function get_randomitem(arr, from, to) {
   if (from == null) {
      from = 0;
      to = arr.length;
   } else if (to == null) {
      to = arr.length;
   }
   return arr[get_random(from, to)];
}



function randCode() {
   return Math.round(Math.random() * 1000000);
}


function randPassword(length) {
   if (length == null) length = 12;
   var s = new Array("abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "0123465789");
   var i;
   var p = "";
   for (i = 0; i < length; i++) {
      p += get_randomitem(s[get_random(0, 3)]);
   }
   return p;
}


function newWnd(page, param, title) {
   var wnd = window.open("", "wnd", "width=700,height=400,location=no,menubar=no,toolbar=no,status=yes,resizable=yes,scrollbars=yes");
   wnd.document.write("<html>\r\n<head>\r\n<title>" + title + "</title>\r\n</head>\r\n\r\n");
   wnd.document.write("<frameset rows='*,15%' border=0>\r\n");
   wnd.document.write("<frame name=table src='webcpms/" + page + ".php?param=" + param + "' noresize frameborder=1>\r\n");
   wnd.document.write("<frame name=control src='webcpms/control.html' noresize frameborder=1>\r\n");
   wnd.document.write("</frameset>\r\n");
   wnd.document.write("</html>\r\n");
   wnd.document.close();
   wnd.focus();
}



function loadPage(url, secure) {
//   var host = location.hostname;
//   var proto = (secure == null || secure == "false" || secure == "" ? "http://" : "https://");
//   var new_location = proto + host + "/" + url;
//alert(new_location);
   window.location.replace(url);
}


function switchLanguage(new_lang) {
//   var loc = window.location + "";
//   loadPage(loc.replace(/&lang=[a-z][a-z]/g, "&lang=" + new_lang));
   setCookie("lang", new_lang);
   location.reload();
}



function getMaxDaysOfMonth(v_month, v_year) {
   var max_day = 0;
   if (v_month == 4 || v_month == 6 || v_month == 9 || v_month == 11) {
      max_day = 30;
   } else if (v_month == 2) {
      max_day = 28;
      if (v_year % 4 == 0) {
         max_day = 29;
      }
   } else {
      max_day = 31;
   }
   return max_day;
}



function printDaySelector(host_day, sel_month, sel_year, sel_day_name, allow_past_date, day_val) {
   ds = "<select name='" + sel_day_name + "'>";
   start = 1;
   o_host_day = document.getElementById(host_day);
   o_sel_year = sel_year == null ? null : document.admin.elements[sel_year];
   o_sel_month = document.admin.elements[sel_month];
   if (o_sel_year != null && !allow_past_date) {
      if (o_sel_year.options[o_sel_year.selectedIndex].value == document.admin.CurrentYear.value) {
         if (makeTwoDigits(o_sel_month.options[o_sel_month.selectedIndex].value) == makeTwoDigits(document.admin.CurrentMonth.value)) {
            start = document.admin.CurrentDay.value;
         }
      }
   }
   d = document.admin.CurrentDay.value;
   if (allow_past_date) {
      if (day_val > 0) d = day_val;
   }
   for (i = start; i <= getMaxDaysOfMonth(o_sel_month.options[o_sel_month.selectedIndex].value, o_sel_year == null ? 2004 : o_sel_year.options[o_sel_year.selectedIndex].value); i++) {
      sel = i == d ? " selected" : "";
      ds += "<option" + sel + " value='" + makeTwoDigits(i) + "'>" + makeTwoDigits(i) + "</option>";
   }
   ds += "</select>";
   o_host_day.innerHTML = ds;

}


function printMonthSelector(host_month, v_host_day, v_sel_year, sel_month_name, v_sel_day_name, allow_past_date, month_val, day_val) {
   ms = "<select name='" + sel_month_name + "' onchange=\"printDaySelector('" + v_host_day.id + "', this.name, '" + (v_sel_year == null ? "" : v_sel_year.name) + "', '" + v_sel_day_name + "', " + allow_past_date + ", " + day_val + ")\">";
   start = 1;
   if (v_sel_year != null && !allow_past_date) {
      if (v_sel_year.options[v_sel_year.selectedIndex].value == document.admin.CurrentYear.value) {
         start = document.admin.CurrentMonth.value;
      }
   }
   m = document.admin.CurrentMonth.value;
   if (allow_past_date) {
      if (month_val > 0) m = month_val;
   }
   for (i = start; i <= 12; i++) {
      sel = i == m ? " selected" : "";
      ms += "<option" + sel + " value='" + makeTwoDigits(i) + "'>" + makeTwoDigits(i) + "</option>";
   }
   ms += "</select>";
   host_month.innerHTML = ms;
   host_day = v_host_day;
   sel_month = document.admin.elements[sel_month_name];
   sel_year = v_sel_year;
   sel_day_name = v_sel_day_name;
   printDaySelector(host_day.id, document.admin.elements[sel_month_name].name, sel_year == null ? null : sel_year.name, sel_day_name, allow_past_date, day_val);
}



function getElementLeft(elem) {
   var x = elem.offsetLeft;
   var tmp = elem.offsetParent;
//   var tmp = elem.parentNode;
   while (tmp != null) {
//      if (tmp.offsetLeft != null) {
//         x += tmp.offsetLeft - tmp.scrollLeft;
         x += tmp.offsetLeft;
//      }
      tmp = tmp.offsetParent;
//      tmp = tmp.parentNode;
//      if (tmp.tagName.toLowerCase() == "body") tmp = null;
   }
   return x;
}

function getElementTop(elem) {
   var y = elem.offsetTop;
   var tmp = elem.offsetParent;
//   var tmp = elem.parentNode;
   while (tmp != null) {
//      if (tmp.offsetTop != null) {
//         y += tmp.offsetTop - tmp.scrollTop;
         y += tmp.offsetTop;
//      }
      tmp = tmp.offsetParent;
//      tmp = tmp.parentNode;
//      if (tmp.tagName.toLowerCase() == "body") tmp = null;
   }
   return y;
}


function isFloating(elem) {
   var tmp = elem;
   var found = false;
   do {
      if (tmp.style.position == "absolute") found = true;
   } while ( (tmp = tmp.offsetParent) != null && !found );
   return found;
}


function removeAllChildren(elem) {
   if (elem == null) return;
   if (elem.hasChildNodes()) {
      while (elem.childNodes.length > 0) {
         elem.removeChild(elem.firstChild);
      } 
   }
}


function setSelectedDate(host_id, input_id, y, m, d, year_id, month_id, day_id, callback) {
   var year = document.getElementById(year_id);
   year.value = y;
   var month = document.getElementById(month_id + "_sel");
   month.value = m;
   var day = document.getElementById(day_id + "_sel");
   day.value = d;
   hideDateInput(host_id, input_id, year_id, month_id, day_id, callback);
}


function getCalendar(host_id, input_id, year, month, year_id, month_id, day_id, callback) {
   var i, j;
   var cal = "<tr>";
   for (i = 0; i < 7; i++) {
      cal += "<td class='dayname'>" + days[i].substring(0, 2) + "</td>\r\n";
   }
   cal += "</tr>\r\n";
   var offset = new Date(year, month - 1, 1).getDay() - 1;
   for (j = 0; j < 6; j++) {
      cal += "<tr>";
      for (i = 0; i < 7; i++) {
         var day = i + j * 7 - offset;
         if (day > 0 && day <= getMaxDaysOfMonth(month, year)) {
            var cls = (i == 0 || i == 6 ? "cal_weekend" : "cal_weekday");
            var cls_hover = (i == 0 || i == 6 ? "cal_hover_weekend" : "cal_hover_weekday");
            cal += "<td class='" + cls + "' onclick=\"setSelectedDate('" + host_id + "', '" + input_id + "', " + year + ", " + month + ", " + day + ", '" + year_id + "', '" + month_id + "', '" + day_id + "', '" + callback + "')\">";
            cal += day;
         } else {
            var cls = (i == 0 || i == 6 ? "cal_dummy_weekend" : "cal_dummy_weekday");
            cal += "<td class='" + cls + "'>";
            cal += "&nbsp;";
         }
         cal += "</td>";
      }
      cal += "</tr>";
   }
   return cal;
}



function setYearMonth(host_id, input_id, year, month, year_id, month_id, day_id, callback) {

   var m = month <= 0 ? 12 : month > 12 ? 1 : month;
   var y = year;

   var cal = "<table>\r\n";
   cal += "<tr><td class='navig' onclick=\"setYearMonth('" + host_id + "', '" + input_id + "', " + (y - 1) + ", " + m + ", '" + year_id + "', '" + month_id + "', '" + day_id + "', '" + callback + "');\">&lt;&lt;</td><td colspan=5 class='monthyear'>" + y + "</td><td class='navig' onclick=\"setYearMonth('" + host_id + "', '" + input_id + "', " + (y * 1 + 1) + ", " + m + ", '" + year_id + "', '" + month_id + "', '" + day_id + "', '" + callback + "');\">&gt;&gt;</td></tr>\r\n";
   cal += "<tr><td class='navig' onclick=\"setYearMonth('" + host_id + "', '" + input_id + "', " + y + ", " + (m - 1) + ", '" + year_id + "', '" + month_id + "', '" + day_id + "', '" + callback + "');\">&lt;&lt;</td><td colspan=5 class='monthyear'>" + months[m - 1] + "</td><td class='navig' onclick=\"setYearMonth('" + host_id + "', '" + input_id + "', " + y + ", " + (m * 1 + 1) + ", '" + year_id + "', '" + month_id + "', '" + day_id + "', '" + callback + "');\">&gt;&gt;</td></tr>\r\n";
   cal += getCalendar(host_id, input_id, y, m, year_id, month_id, day_id, callback);
   cal += "<tr><td colspan=7 class='button' onclick=\"hideDateInput('" + host_id + "', '" + input_id + "', '" + year_id + "', '" + month_id + "', '" + day_id + "', '" + callback + "');\">Close</td></tr>\r\n";
   cal += "</table>\r\n";

   var host = document.getElementById(host_id);
   host.innerHTML = cal;
}




function showDateInput(input_id, host_id, year_id, month_id, day_id, callback) {
   var input = document.getElementById(input_id);
   var x = getElementLeft(input);
   var y = getElementTop(input);

   var curdate = new Date();

   var d = input.value.split("/");
   var month = d[0] * 1;
   if (!(month >= 1 && month <= 12)) month = curdate.getMonth() + 1;
   var day = d[1] * 1;
   if (!(day >= 1 && day <= getMaxDaysOfMonth(month))) day = curdate.getDate();
   var year = d[2] * 1;
   if (!(year >= 1900 && day <= 2100)) year = curdate.getFullYear();

   var host = document.getElementById(host_id);
   host.style.position = "absolute";
   host.style.left = x + "px";
   host.style.top = (input.offsetHeight * 1 + y * 1) + "px";
   host.style.width = "auto";
   host.style.height = "auto";
   host.style.display = "block";
   host.style.fontSize = "8pt";
   host.style.textAlign = "center";

   setYearMonth(host_id, input_id, year, month, year_id, month_id, day_id, callback);

   showBackground(input_id, host);
}



function hideDateInput(host_id, input_id, year_id, month_id, day_id, callback) {
   var input = document.getElementById(input_id);
   var curdate = new Date();

   var y = document.getElementById(year_id).value;
   var m = document.getElementById(month_id + "_sel").value;
   var d = document.getElementById(day_id + "_sel").value;

   var month = m * 1;
   if (!(month >= 1 && month <= 12)) month = curdate.getMonth() + 1;
   var day = d * 1;
   if (!(day >= 1 && day <= getMaxDaysOfMonth(month))) day = curdate.getDate();
   var year = y * 1;
   if (!(year >= 1900 && day <= 2100)) year = curdate.getFullYear();

   input.value = makeTwoDigits(month) + " / " + makeTwoDigits(day) + " / " + year;

   if (host_id != null) {
      var host = document.getElementById(host_id);
      host.style.display = "none";
      hideBackground(input_id);
   }

   if (callback != "") {
      eval(decodeURIComponent(callback));
   }
}

function setDateValue(input_id, year_id, month_id, day_id, y, m, d) {
   if (y == null && m == null && d == null) {
      var curdate = new Date();
      y = curdate.getFullYear();
      m = curdate.getMonth() + 1;
      d = curdate.getDate();
   }
   document.getElementById(year_id).value = y;
   document.getElementById(month_id + "_sel").value = makeTwoDigits(m);
   document.getElementById(day_id + "_sel").value = makeTwoDigits(d);
   document.getElementById(input_id).value = makeTwoDigits(m) + " / " + makeTwoDigits(d) + " / " + y;
}


function setCurrentDate(host_id, input_id, year_id, month_id, day_id, callback) {
   var date = new Date();
   var y = date.getFullYear();
   var m = date.getMonth() + 1;
   var d = date.getDate();
   setSelectedDate(host_id, input_id, y, m, d, year_id, month_id, day_id, callback);
}




function setInputTimeNumRows(prefix, hour_id, min_id, hour, min, callback, num_rows) {
   if (num_rows % 2) {
      if (num_rows < 7) num_rows = 7;
         else if (num_rows > 21) num_rows = 21;
      document.getElementById("NumRows_" + hour_id).value = num_rows;
      showTimeInput(prefix, hour_id, min_id, callback);
   }
}


function setInputTimeOffset(prefix, hour_id, min_id, hour, min, callback, offset) {
   offset = offset < 0 ? offset + 24 : (offset >= 24 ? offset - 24 : offset);
   document.getElementById("Offset_" + hour_id).value = offset;
   showTimeInput(prefix, hour_id, min_id, callback);
}

function setHourMin(prefix, hour_id, min_id, hour, min, callback) {
   var num_rows = document.getElementById("NumRows_" + hour_id).value * 1;
   var offset = document.getElementById("Offset_" + hour_id).value * 1;
//   var hoffset = offset * 1 + hour * 1;
   var hoffset = offset;


   var tt = "<table>\r\n";
   var i, j;
//   var hoffset = Math.min(Math.max(0, hoffset), 24 - num_rows);
//   offset = hoffset - hour;
//
//alert("hour: " + hour + "\noffs: " + offs + "\noffset: " + offset + "\nhoffset: " + hoffset);

//   var f = Math.max(hoffset, 0);
//   var t = Math.min(hoffset * 1 + num_rows, 24);

   var f = hoffset;
   var t = hoffset + num_rows;

   for (i = f; i < t; i++) {
      tt += "<tr>";
      if (i == hoffset) {
         tt += "<td class='expand' rowspan=3 onclick=\"setInputTimeNumRows('" + prefix + "', '" + hour_id + "', '" + min_id + "', '" + hour + "', '" + min + "', '" + callback + "', " + (num_rows * 1 + 4) + ")\" title='Expand'>&nbsp;</td>";
      } else if (i == hoffset * 1 + 3) {
         tt += "<td class='empty' rowspan='" + (num_rows - 6) + "'>&nbsp;</td>";
      } else if (i == hoffset * 1 + (num_rows - 3)) {
         tt += "<td class='collapse' rowspan=3 onclick=\"setInputTimeNumRows('" + prefix + "', '" + hour_id + "', '" + min_id + "', '" + hour + "', '" + min + "', '" + callback + "', " + (num_rows - 4) + ")\" title='Collapse'>&nbsp;</td>";
      }
      for (j = 0; j < 4; j++) {
         var h = i < 0 ? i + 24 : (i >= 24 ? i - 24 : i);
         tt += "<td class='time' onclick=\"setHourMinValues('" + prefix + "', '" + hour_id + "', '" + min_id + "', " + makeTwoDigits(h) + ", " + makeTwoDigits(j * 15) + ", '" + callback + "')\">" + convertTime(h + ":" + (j * 15)) + "</td>";
      }
      if (i == hoffset) {
         tt += "<td class='sc_u_m' rowspan=2 onclick=\"setInputTimeOffset('" + prefix + "', '" + hour_id + "', '" + min_id + "', '" + hour + "', '" + min + "', '" + callback + "', " + (offset - num_rows) + ")\" title='Scroll up a page'>&nbsp;</td>";
      } else if (i == hoffset * 1 + 2) {
         tt += "<td class='sc_u_1' onclick=\"setInputTimeOffset('" + prefix + "', '" + hour_id + "', '" + min_id + "', '" + hour + "', '" + min + "', '" + callback + "', " + (offset - 1) + ")\" title='Scroll up a line'>&nbsp;</td>";
      } else if (i == hoffset * 1 + 3) {
         tt += "<td class='empty' rowspan='" + (num_rows - 6) + "'>&nbsp;</td>";
      } else if (i == hoffset * 1 + (num_rows - 3)) {
         tt += "<td class='sc_d_1' onclick=\"setInputTimeOffset('" + prefix + "', '" + hour_id + "', '" + min_id + "', '" + hour + "', '" + min + "', '" + callback + "', " + (offset * 1 + 1) + ")\" title='Scroll down a line'>&nbsp;</td>";
      } else if (i == hoffset * 1 + (num_rows - 2)) {
         tt += "<td class='sc_d_m' rowspan=2 onclick=\"setInputTimeOffset('" + prefix + "', '" + hour_id + "', '" + min_id + "', '" + hour + "', '" + min + "', '" + callback + "', " + (offset * 1 + num_rows) + ")\" title='Scroll down a page'>&nbsp;</td>";
      }
      tt += "</tr>";
   }
   tt += "<tr><td colspan=6 class='button' onClick=\"hideTimeInput('Input_" + prefix + "', 'Host_" + prefix + "', '" + hour_id + "', '" + min_id + "', '" + callback + "');\">Close</td></tr>\r\n";
   tt += "</table>\r\n";

   var host = document.getElementById("Host_" + prefix);
   host.innerHTML = tt;
}



function trim(str, chars_to_trim) {

   if (str == null) return "";
   str += "";

   var ctt = "\r\n\t ";

   if (chars_to_trim != null) ctt += chars_to_trim;

   var first = 0,
       last = str.length - 1;

   while (first < str.length && (ctt.indexOf(str.charAt(first)) > -1)) first++;
   while (last >= 0 && (ctt.lastIndexOf(str.charAt(last)) > -1)) last--;

   return str.substring(first, last + 1);
}




function showTimeInput(prefix, hour_id, min_id, callback) {
   var input = document.getElementById("Input_" + prefix);
   var x = getElementLeft(input);
   var y = getElementTop(input);

   var ref = document.getElementById('Referrer_' + prefix).value;
   var scrollLeft = ref.length > 0 ? document.getElementById(ref).scrollLeft : 0;
   var scrollTop = ref.length > 0 ? document.getElementById(ref).scrollTop : 0;

   var curdate = new Date();

   var time = input.value;
   var idx_colon = time.indexOf(":");
   var h = time.substring(0, idx_colon);
   var idx_ampm = time.toLowerCase().indexOf("am");
   if (idx_ampm == -1) {
      idx_ampm = time.toLowerCase().indexOf("pm");
   }
   var m = idx_ampm == -1 ? time.substring(idx_colon + 1) : time.substring(idx_colon + 1, time.indexOf(":"));
   var ampm = idx_ampm == -1 ? "" : time.toLowerCase().substring(idx_ampm);
   if (ampm == "am" || ampm == "pm") {
      if (!(h >= 0 && h <= 12)) { // h < 0 || h > 12
         h = curdate.getHours();
         if (h > 12) h -= 12;
      }
      if (ampm == "pm") {
         if (h < 12) h = h * 1 + 12;
      } else if (ampm == "am") {
         if (h == 12) h = 0;
      }
   } else {
      if (!(h >= 0 && h <= 23)) h = curdate.getHours();
   }
   if (!(m >= 0 && m <= 59)) m = Math.floor(curdate.getMinutes() / 15) * 15;

   var host = document.getElementById("Host_" + prefix);
   host.style.position = "absolute";
   host.style.left = (x - scrollLeft) + "px";
   host.style.top = (input.offsetHeight * 1 + y * 1 - scrollTop) + "px";
   host.style.width = "auto";
   host.style.height = "auto";
   host.style.display = "block";
   host.style.fontSize = "8pt";
   host.style.textAlign = "center";

   setHourMin(prefix, hour_id, min_id, h, m, callback);

   showBackground("Input_" + prefix, host);
}


function hideTimeInput(input_id, host_id, hour_id, min_id, callback) {
   var input = document.getElementById(input_id);
   var curdate = new Date();

   var h = document.getElementById(hour_id).value;
   var m = document.getElementById(min_id).value;

   if (!(h >= 0 && h <= 23)) h = curdate.getHours();
   if (!(m >= 0 && m <= 59)) m = Math.floor(curdate.getMinutes() / 15) * 15;

   input.value = convertTime(h, m);

   var host = document.getElementById(host_id);
   host.style.display = "none";

   hideBackground(input_id);

   if (callback != "") {
      eval(decodeURIComponent(callback));
   }
}


function setHourMinValues(prefix, hour_id, min_id, hour, min, callback) {
   setTimeValue(hour_id, min_id, hour, min);
   hideTimeInput("Input_" + prefix, "Host_" + prefix, hour_id, min_id, callback);
}


function setTimeValue(hostid_hour, hostid_min, hour, min) {
   if (hour == null && min == null) {
      var curdate = new Date();
      hour = curdate.getHours();
      min = curdate.getMinutes();
   }
   document.getElementById(hostid_hour).value = hour;
   document.getElementById(hostid_min).value = min;
   document.getElementById("Input_" + hostid_hour).value = convertTime(hour, min);
}





function print15Selector(name_selector, val, start, end, onchange) {
   if (isNaN(val)) val = 15;
   if (start == "" || start == null) start = 0; else start = Math.floor(start / 15);
   if (end == "" || end == null) end = 16; else end = Math.floor(end / 15);
   if (end <= start) return "";
   var onchng = onchange == null ? "" : " onchange=\"" + onchange + "\"";
   var seltxt = "<select id='" + name_selector + "' name='" + name_selector + "'" + onchng + ">\n";
   var i;
   for (i = start; i <= end; i++) {
      var i15 = i * 15;
      var sel = i15 == val ? " selected='selected'" : "";
      seltxt += "\t<option value='" + i15 + "'" + sel + ">" + i15 + "</option>\n";
   }
   seltxt += "</select>\n";

   return seltxt;
}



function validEMailAddress(email) {
   return email == null ? false : email.indexOf("@") > 0 && email.indexOf(".");
}

function validEMailForm(name, doalert) {
   var name_sender = document.getElementById(name + "EMailInputSenderName").value;
   var email_sender = document.getElementById(name + "EMailInputSenderAddr").value;
   var name_recipient = document.getElementById(name + "EMailInputRecipientName").value;
   var email_recipient = document.getElementById(name + "EMailInputRecipientAddr").value;

   if (doalert) {
      var invalid = "";
      if (name_sender.length == 0) invalid += "   Your name\n";
      if (name_recipient.length == 0) invalid += "   Your e-mail address\n";
      if (!validEMailAddress(email_sender)) invalid += "   Recipient name\n";
      if (!validEMailAddress(email_recipient)) invalid += "   Recipient e-mail address\n";
      if (invalid.length > 0) alert("All fields must be filled correctly. The following fields are missing or invalid:\n" + invalid);
   }

   return name_sender.length > 0 && name_recipient.length > 0 && validEMailAddress(email_sender) && validEMailAddress(email_recipient);
}

function getWindowWidth() {
   var w = 0;
   if (typeof(window.innerWidth) == 'number') {
      w = window.innerWidth;
   } else if (document.documentElement && document.documentElement.clientWidth) {
      w = document.documentElement.clientWidth;
   } else if (document.body && document.body.clientWidth) {
      w = document.body.clientWidth;
   }
   return w;
}

function getWindowHeight() {
   var h = 0;
   if (typeof(window.innerWidth) == 'number') {
      h = window.innerHeight;
   } else if (document.documentElement && document.documentElement.clientHeight) {
      h = document.documentElement.clientHeight;
   } else if (document.body && document.body.clientHeight) {
      h = document.body.clientHeight;
   }
   return h;
}


function alignWnd(paper) {
   var p = document.getElementById(paper);
   if (!p) return;

   var pr = getElementLeft(p) * 1 + Math.max(getWindowWidth(), p.offsetWidth);
   var pb = getElementTop(p) * 1 + Math.max(getWindowHeight(), p.offsetHeight);
   return new Array(pr, pb);
}

function showBackground(name, host, align) {

   if (align) {
      var r = getElementLeft(host) * 1 + host.offsetWidth * 1;
      var b = getElementTop(host) * 1 + host.offsetHeight * 1;
      if (r > align[0]) host.style.left = (align[0] - host.offsetWidth - 10) + "px";
      if (b > align[1]) host.style.top = (align[1] - host.offsetHeight - 10) + "px";
   }

   var x = getElementLeft(host);
   var y = getElementTop(host);
   var bg1 = document.getElementById(name + 'BG1');
   var bg2 = document.getElementById(name + 'BG2');
   var bg3 = document.getElementById(name + 'BG3');
   if (bg1 == null) {
      bg1 = document.createElement("span");
      bg1.setAttribute("id", name + "BG1");
      host.parentNode.insertBefore(bg1, host.nextSibling);
   }
   if (bg2 == null) {
      bg2 = document.createElement("span");
      bg2.setAttribute("id", name + "BG2");
      host.parentNode.insertBefore(bg2, host.nextSibling);
   }
   if (bg3 == null) {
      bg3 = document.createElement("span");
      bg3.setAttribute("id", name + "BG3");
      host.parentNode.insertBefore(bg3, host.nextSibling);
   }
   bg1.style.position = "absolute";
   bg1.style.left = (x * 1 + Math.floor(host.offsetWidth / 2)) + "px";
   bg1.style.top = y + "px";
   bg1.style.width = (Math.floor(host.offsetWidth / 2) + 5) + "px";
   bg1.style.height = Math.floor(host.offsetHeight / 2) + "px";
   bg1.style.display = "block";
   bg1.style.background = "url('webcpms/icons/popupbg_tr.png') right top no-repeat";
   bg1.style.zIndex = 65530;
   bg2.style.position = "absolute";
   bg2.style.left = (x * 1 + Math.floor(host.offsetWidth / 2)) + "px";
   bg2.style.top = (y * 1 + Math.floor(host.offsetHeight / 2)) + "px";
   bg2.style.width = (Math.floor(host.offsetWidth / 2) + 5) + "px";
   bg2.style.height = (Math.floor(host.offsetHeight / 2) + 5) + "px";
   bg2.style.display = "block";
   bg2.style.background = "url('webcpms/icons/popupbg_br.png') right bottom no-repeat";
   bg2.style.zIndex = 65530;
   bg3.style.position = "absolute";
   bg3.style.left = x + "px";
   bg3.style.top = (y * 1 + Math.floor(host.offsetHeight / 2)) + "px";
   bg3.style.width = Math.floor(host.offsetWidth / 2) + "px";
   bg3.style.height = (Math.floor(host.offsetHeight / 2) + 5) + "px";
   bg3.style.display = "block";
   bg3.style.background = "url('webcpms/icons/popupbg_bl.png') left bottom no-repeat";
   bg3.style.zIndex = 65530;
}


function hideBackground(name) {
   var bg1 = document.getElementById(name + 'BG1');
   var bg2 = document.getElementById(name + 'BG2');
   var bg3 = document.getElementById(name + 'BG3');
   if (bg1 != null) bg1.style.display = "none";
   if (bg2 != null) bg2.style.display = "none";
   if (bg3 != null) bg3.style.display = "none";
}




function showEMailPanel(refobj_id, name, title, callback, entry_id, topic_id) {
   var refobj = document.getElementById(refobj_id);
   if (refobj == null) return;
   var x = getElementLeft(refobj);
   var y = getElementTop(refobj);

   var p = alignWnd("MainPage");

   var host = document.getElementById(name + 'PopupHost');
   host.style.position = "absolute";
   host.style.left = x + "px";
   host.style.top = (y * 1 + refobj.offsetHeight * 1) + "px";
   host.style.display = "block";

   var email = "<table><tr><td colspan=2><table><tr><td colspan=2 class='h2'>E-Mail This Article</td></tr>\r\n";
   email += "<tr><td class='small_label'>Your name:</td><td><input type='text' class='small_text' id='" + name + "EMailInputSenderName' name='" + name + "EMailInputSenderName' size='40' value='" + getCookie("EMailInputSenderName") + "' onkeyup=\"setCookie('EMailInputSenderName', this.value, 7 * 24 * 3600)\" /></td></tr>\r\n";
   email += "<tr><td class='small_label'>Your e-mail address:</td><td><input type='text' class='small_text' id='" + name + "EMailInputSenderAddr' name='" + name + "EMailInputSenderAddr' size='40' value='" + getCookie("EMailInputSenderAddr") + "' onkeyup=\"setCookie('EMailInputSenderAddr', this.value, 7 * 24 * 3600)\" /></td></tr>\r\n";
   email += "<tr><td class='small_label'>Recipient name:</td><td><input type='text' class='small_text' id='" + name + "EMailInputRecipientName' name='" + name + "EMailInputRecipientName' size='40' value='" + getCookie("EMailInputRecipientName") + "' onkeyup=\"setCookie('EMailInputRecipientName', this.value, 7 * 24 * 3600)\" /></td></tr>\r\n";
   email += "<tr><td class='small_label'>Recipient e-mail address:</td><td><input type='text' class='small_text' id='" + name + "EMailInputRecipientAddr' name='" + name + "EMailInputRecipientAddr' size='40' value='" + getCookie("EMailInputRecipientAddr") + "' onkeyup=\"setCookie('EMailInputRecipientAddr', this.value, 7 * 24 * 3600)\" /></td></tr>\r\n";
   email += "<tr><td class='small_label_left' colspan=2>Subject:</td></tr>\r\n";
   email += "<tr><td colspan=2><input type='text' class='small_text' id='EMailInputSubject' name='EMailInputSubject' size='65' value='" + decodeURIComponent(title) + "' /></td></tr>\r\n";
   email += "<tr><td class='small_label_left' colspan=2>Your comment:</td></tr>\r\n";
   email += "<tr><td colspan=2><textarea class='small_text' id='EMailInputComment' name='EMailInputComment' cols='40' rows='3' onkeyup=\"setCookie('EMailInputComment', this.value, 7 * 24 * 3600)\">" + getCookie("EMailInputComment") + "</textarea></td></tr></table></td></tr>\r\n";
   email += "<tr><td class='button' width='50%' onclick=\"" + callback + "('" + name + "', " + entry_id + ", " + topic_id + ")\">Send</td><td class='button' width='50%' onclick=\"hideEMailPanel('" + name + "')\">Cancel</td></tr></table>\r\n";
//   email += "<div id='" + name + "BG1'></div><div id='" + name + "BG2'></div><div id='" + name + "BG3'></div>";

   host.innerHTML = email;

//   showBackground(name, host, p);
   showBackground(name, host);
}


function hideEMailPanel(name) {
   var host = document.getElementById(name + "PopupHost");
   host.style.display = "none";
   hideBackground(name);
}



function dec2hex(dec) {
   var hex = "";
   var h = "0123456789abcdef";
   do {
      var m = dec % 16;
      dec = Math.floor(dec / 16);
      hex = h.charAt(m) + hex;
   } while (dec > 0);
   return hex;
}


function rgb2hex(r, g, b) {
   if (g == null && b == null) {
      var rgb = r.split(",");
      if (rgb.length == 1) {
         rgb = document.getElementById(r).value.split(",");
      }
      r = rgb[0];
      g = rgb[1];
      b = rgb[2];
   }
   return "#" + makeTwoDigits(dec2hex(r)) + makeTwoDigits(dec2hex(g)) + makeTwoDigits(dec2hex(b));
}


function showColorSelector(prefix) {
   var refobj = document.getElementById(prefix + "ColorSelectorHost");
   if (refobj == null) return;
   var x = getElementLeft(refobj);
   var y = getElementTop(refobj);

   var p = alignWnd("MainPage");

   var host = document.getElementById(prefix + 'ColorSelector');
   host.style.position = "absolute";
   host.style.left = x + "px";
   host.style.top = (y * 1 + refobj.offsetHeight * 1) + "px";
   host.style.display = "block";

   var full = document.getElementById(prefix + 'ColorSelectorMode').value * 1 == 1 ? true : false;
   var icon = full ? "left" : "right";

   var i;

   var cs = "<table><tr><td colspan=6 class='h2'><span style='float: right;'><img src='webcpms/icons/" + icon + "_dbl.gif' id='" + prefix + "ColorSelectorModeIcon' onmouseover=\"this.src = 'webcpms/icons/" + icon + "_dbl_on.gif';\" onmouseout=\"this.src = 'webcpms/icons/" + icon + "_dbl.gif';\" onclick=\"document.getElementById('" + prefix + "ColorSelectorMode').value = 1 - document.getElementById('" + prefix + "ColorSelectorMode').value;showColorSelector('" + prefix + "');\" class='rte_dropdn' /></span>Pick color</td></tr>\r\n";
   for (i = 0; i < document.getElementById(prefix + 'NumColors').value * 1; i++) {
      cs += "<tr>";
      cs += "<td>" + document.getElementById(prefix + 'ColorName_' + i).value + "</td>";
      if (full) {
         cs += "<td><div style='width: 16px; height: 16px; border: solid 1px #c0c0c0; background: " + rgb2hex(prefix + 'ColorEvenDarker_' + i) + ";'></div></td>";
         cs += "<td><div style='width: 16px; height: 16px; border: solid 1px #c0c0c0; background: " + rgb2hex(prefix + 'ColorDarker_' + i) + ";'></div></td>";
      }
      cs += "<td><div style='width: 16px; height: 16px; border: solid 1px #c0c0c0; background: " + rgb2hex(prefix + 'ColorBase_' + i) + ";'></div></td>";
      if (full) {
         cs += "<td><div style='width: 16px; height: 16px; border: solid 1px #c0c0c0; background: " + rgb2hex(prefix + 'ColorLighter_' + i) + ";'></div></td>";
         cs += "<td><div style='width: 16px; height: 16px; border: solid 1px #c0c0c0; background: " + rgb2hex(prefix + 'ColorEvenLighter_' + i) + ";'></div></td>";
      }
      cs += "</tr>";
   }
   cs += "<tr><td colspan=6 class='button' onclick=\"hideColorSelector('" + prefix + "')\">Close</td></tr></table>\r\n";

   host.innerHTML = cs;

//   showBackground(prefix, host, p);
   showBackground(prefix, host);
}


function hideColorSelector(prefix) {
   var host = document.getElementById(prefix + "ColorSelector");
   host.style.display = "none";
   hideBackground(prefix);
}


function getArticleNavButton(name, icon, func, caption, title, entry_id, topic_id) {
   var t_id = topic_id == null ? "" :  ", " + topic_id;
   return "<span id='" + name + "NavButton' class='menuitem' onclick=\"" + func + "('" + name + "', '" + encodeURI(title) + "', " + entry_id + t_id + ")\">" + (icon.length == 0 ? "" : "<img src='webcpms/icons/" + icon + "' alt='" + caption + "' title='" + caption + "' />") + "</span><span id='" + name + "PopupHost' class='popupwnd' style='display: none;'></span><span id='" + name + "Indicator' class='indicator_off'></span>";
}


function jump(num, from_id, to_id) {
   var from = document.getElementById(from_id);
   var to = document.getElementById(to_id);
   if (from.value.length >= num) {
      from.value = from.value.substring(0, num);
      if (to != null) {
         to.focus();
      }
   }
}


function switchTab(prefix, cur_tab) {
   var tabs = document.getElementById(prefix + 'Tabs').value.split(",");

   document.getElementById(prefix + 'SelectedTab').value = cur_tab;

   var i;
   for (i = 0; i < tabs.length; i++) {
      var sel = prefix + tabs[i] + "Tab" == cur_tab ? true : false;
      toggle(prefix + tabs[i] + "Panel", sel);
      document.getElementById(prefix + tabs[i] + 'Tab').className = sel ? "selectortab_hover" : "selectortab";
   }
}



function checkPasswordStrength(pw, host) {
   var level = 0;
   if (pw != "") {
      level++;
      if (pw.length >= 6) {
         level++;
         if (pw.toLowerCase() != pw) {
            level++;
         }
         if (pw.match(/[0-9]/)) {
            level++;
         }
      }
   }
   pws = document.getElementById(host);
   if (pws != null) {
      switch (level) {
         case 0:
            pws.innerHTML = "No password typed";
            break;
         case 1:
            pws.innerHTML = "<font color=red>Password should be at least 6 characters long.</font>";
            break;
         case 2:
            pws.innerHTML = "<font color=red>Weak password. Use mixed case and numbers.</font>";
            break;
         case 3:
            pws.innerHTML = "<font color=blue>Medium strong password. Use mixed case and numbers.</font>";
            break;
         case 4:
            pws.innerHTML = "<font color=green>Strong password.</font>";
            break;
      }
   }
   return level;
}


function checkPasswordMatch(pw, pwAgain, host_id, title_pipe, title_x) {
   var res = false;
   host = document.getElementById(host_id);
   if (host == null) {
      return pw == pwAgain ? true : false;
   }
   if (pwAgain == "") {
      host.innerHTML = "";
      return res;
   }
   var title = "";
   if (title_pipe != "" && title_x != "") {
      var t;
      if (pw == pwAgain) {
         t = title_pipe;
         res = true;
      } else {
         t = title_x;
      }
      title = "alt='" + t + "' title='" + t + "'";
   }
   host.innerHTML = "<img src='" + getIconDir() + (pw == pwAgain ? "check_pipe" : "check_x") + ".gif' width=16 height=16 " + title + " />";
   return res;
}




function checkTitle(prefix, show_alert) {
   var title = "";
   var havetitle = new Array();
   for (i = 0; i < languages.length; i++) {
      var t = document.getElementById(prefix + 'Title_' + languages[i].descr).value;
      havetitle[i] = t == "" ? false : true;
      title += "&title_" + languages[i].descr + "=" + encodeURIComponent(t);
   }
   var ht = false;
   for (i = 0; i < havetitle.length; i++) {
      if (havetitle[i] == true) ht = true;
   }
   if (!ht && show_alert) {
      alert("Please specify a title for at least one language!");
      return "";
   }
   return title;
}



var TITLE_ONLY = 2;

function checkTitleDescr(prefix, show_alert) {
   var title = "";
   var descr = "";
   var havetitle = new Array();
   var havedescr = new Array();
   for (i = 0; i < languages.length; i++) {
      var t = document.getElementById(prefix + 'Title_' + languages[i].descr).value;
      havetitle[i] = t == "" ? false : true;
      title += "&title_" + languages[i].descr + "=" + encodeURIComponent(t);
      var editor = eval("wre" + prefix + "Descr");
      var d = editor.getText(false, languages[i].descr);
      havedescr[i] = d == "" ? false : true;
      descr += "&descr_" + languages[i].descr + "=" + encodeURIComponent(d);
   }
   var ht = false;
   var twod = "",
       dwot = "";
   for (i = 0; i < havetitle.length; i++) {
      if (havetitle[i] == true) ht = true;
      if (havetitle[i] == true && havedescr[i] == false) {
         twod += "   " + languages[i].english_name + "\n";
      } else if (havetitle[i] == false && havedescr[i] == true) {
         dwot += "   " + languages[i].english_name + "\n";
      }
   }
   if (!ht) {
      alert("Please specify a title for at least one language!");
      return "";
   } else {
      if ((show_alert > 0 && show_alert != TITLE_ONLY && twod != "") || dwot != "") {
         var msg = "";
         if (show_alert > 0 && show_alert != TITLE_ONLY) {
            if (twod != "") {
               msg += "Please write a description for the following language(s):\n" + twod;
            }
         }
         if (dwot != "") {
            msg += "Please specify a title for the following language(s):\n" + dwot;
         }
         if (show_alert) {
            alert(msg);
            return "";
         }
      }
   }
   return title + descr;
}


function processIntervalSelector(prefix) {
   var val = document.getElementById(prefix + 'Interval').value;
   if (val == "" || isNaN(val)) {
      return 0;
   }
   var unit = document.getElementById(prefix + 'Selector').value;
   if (unit == "minutes") {
      return 60 * val;
   } else if (unit == "hours") {
      return 3600 * val;
   } else if (unit == "days") {
      return 86400 * val;
   } else if (unit == "weeks") {
      return 604800 * val;
   } else if (unit == "months") {
      return 2592000 * val;
   } else if (unit == "years") {
      return 31536000 * val;
   }
   return 0;
}


function setIntervalSelector(prefix, val, unit) {
   var val_input = document.getElementById(prefix + 'Interval');
   var unit_sel = document.getElementById(prefix + 'Selector');
   if (unit == null) {
      if (val % 31536000 == 0) {
         val_input.value = val / 31536000;
         unit_sel.value = "years";
      } else if (val % 2592000 == 0) {
         val_input.value = val / 2592000;
         unit_sel.value = "months";
      } else if (val % 604800 == 0) {
         val_input.value = val / 604800;
         unit_sel.value = "weeks";
      } else if (val % 86400 == 0) {
         val_input.value = val / 86400;
         unit_sel.value = "days";
      } else if (val % 3600 == 0) {
         val_input.value = val / 3600;
         unit_sel.value = "hours";
      } else if (val % 60 == 0) {
         val_input.value = val / 60;
         unit_sel.value = "minutes";
      }
   } else {
      val_input.value = val;
      unit_sel.value = unit;
   }
}


function getIntervalSelector(prefix, val_interval, val_selector, preferred_unit, btn_caption, callback) {
   if (val_interval == null) val_interval = 3;
   if (val_selector == null) val_selector = "days";
   if (preferred_unit == null) preferred_unit = "days";
   if (btn_caption == null) btn_caption = "";
   if (callback == null) callback = "";
   if (val_selector == "seconds") {
      if (val_interval % 31536000 == 0 && preferred_unit == "years") {
         val_interval /= 31536000;
         val_selector = "years";
      } else if (val_interval % 2592000 == 0 && preferred_unit == "months") {
         val_interval /= 2592000;
         val_selector = "months";
      } else if (val_interval % 604800 == 0 && preferred_unit == "weeks") {
         val_interval /= 604800;
         val_selector = "weeks";
      } else if (val_interval % 86400 == 0 && preferred_unit == "days") {
         val_interval /= 86400;
         val_selector = "days";
      } else if (val_interval % 3600 == 0 && preferred_unit == "hours") {
         val_interval /= 3600;
         val_selector = "hours";
      } else if (val_interval % 60 == 0 && preferred_unit == "minutes") {
         val_interval /= 60;
         val_selector = "minutes";
      }
   }
   var ret = "";
   ret += "<input type='text' id='" + prefix + "Interval' name='" + prefix + "Interval' value='" + val_interval + "' size='2' />&nbsp;";
   ret += "<select id='" + prefix + "Selector' name='" + prefix + "Selector'>\r\n";
   ret += "\t<option value='minutes'" + (val_selector == "minutes" ? " selected='selected'" : "") + ">minutes</option>\r\n";
   ret += "\t<option value='hours'" + (val_selector == "hours" ? " selected='selected'" : "") + ">hours</option>\r\n";
   ret += "\t<option value='days'" + (val_selector == "days" ? " selected='selected'" : "") + ">days</option>\r\n";
   ret += "\t<option value='weeks'" + (val_selector == "weeks" ? " selected='selected'" : "") + ">weeks</option>\r\n";
   ret += "\t<option value='months'" + (val_selector == "months" ? " selected='selected'" : "") + ">months</option>\r\n";
   ret += "\t<option value='years'" + (val_selector == "years" ? " selected='selected'" : "") + ">years</option>\r\n";
   ret += "</select>";
   if (btn_caption != "") {
      var clk = onclick == "" ? "" : "onclick=\"" + callback + "\"";
      ret += "&nbsp;<input type='button' class='button' value='" + btn_caption + "' " + clk + " />";
   }
   return ret;
}



function getInputPhone(name_area, name_first, name_second, next, val_area, val_first, val_second, cls, non_editable) {
   if (next == null) next = "";
   if (val_area == null) val_area = "";
   if (val_first == null) val_first = "";
   if (val_second == null) val_second = "";
   var claz = cls == null ? "" : "class='" + cls + "'";
   var ret = "";
   if (non_editable) {
      ret += "<input type='hidden' value='" + val_area + "' name='" + name_area + "' id='" + name_area + "' />";
      ret += "<input type='hidden' value='" + val_first + "' name='" + name_first + "' id='" + name_first + "' />";
      ret += "<input type='hidden' value='" + val_second + "' name='" + name_second + "' id='" + name_second + "' />";
      if (val_area != "" && val_first != "" && val_second != "") {
         ret += val_area + "&nbsp;<sup>_</sup>&nbsp;" + val_first + "&nbsp;<sup>_</sup>&nbsp;" + val_second;
      }
   } else {
      ret += "<input type='text' " + claz + " value='" + val_area + "' name='" + name_area + "' id='" + name_area + "' size=2 onkeyup=\"jump(3, '" + name_area + "', '" + name_first + "');\" />&nbsp;<sup>_</sup>&nbsp;";
      ret += "<input type='text' " + claz + " value='" + val_first + "' name='" + name_first + "' id='" + name_first + "' size=2 onkeyup=\"jump(3, '" + name_first + "', '" + name_second + "');\" />&nbsp;<sup>_</sup>&nbsp;";
      ret += "<input type='text' " + claz + " value='" + val_second + "' name='" + name_second + "' id='" + name_second + "' size=3 onkeyup=\"jump(4, '" + name_second + "', '" + next + "');\" />";
   }
   return ret;
}


function setInputPhone(name_area, name_first, name_second, val_area, val_first, val_second) {
   if (val_area == null) val_area = "";
   if (val_first == null) val_first = "";
   if (val_second == null) val_second = "";

   document.getElementById(name_area).value = val_area;
   document.getElementById(name_first).value = val_first;
   document.getElementById(name_second).value = val_second;
}

function getInputDate(name_month, name_day, name_year, year, allow_past, month_val, day_val, year_val, callback) {
   var spec_date = new Date();
   if (year_val != null) spec_date.setFullYear(year_val);
   if (month_val != null) spec_date.setMonth(month_val - 1);
   if (day_val != null) spec_date.setDate(day_val);
   var month = spec_date.getMonth() + 1;
   var day = spec_date.getDate();
   var year = spec_date.getFullYear();
   if (callback != null) callback = encodeURIComponent(callback);
   var ret = "";
   ret += "<span id='Host_" + name_month + "' class='popupwnd' style='display: none;'></span>";
   ret += "<input type='text' class='dateinput' id='Input_" + name_year + "' name='Input_" + name_year + "' value='" + makeTwoDigits(month) + " / " + makeTwoDigits(day) + " / " + year + "' size=15 onfocus=\"showDateInput('Input_" + name_year + "', 'Host_" + name_month + "', '" + name_year + "', '" + name_month + "', '" + name_day + "', " + (callback == null ? "null" : "'" + callback + "'") + ");\" onkeyup=\"showDateInput('Input_" + name_year + "', 'Host_" + name_month + "', '" + name_year + "', '" + name_month + "', '" + name_day + "', " + (callback == null ? "null" : "'" + callback + "'") + ");\" />\r\n";
   ret += "<input type='hidden' id='" + name_month + "_sel" + "' name='" + name_month + "_sel' value='" + makeTwoDigits(month) + "' />\r\n";
   ret += "<input type='hidden' id='" + name_day + "_sel" + "' name='" + name_day + "_sel' value='" + makeTwoDigits(day) + "' />\r\n";
   ret += "<input type='hidden' id='" + name_year + "' name='" + name_year + "' value='" + makeTwoDigits(year) + "' />";
   return ret;
}


function getInputTime(name_hour, name_min, val_hour, val_min, callback, referrer_id) {
   if (isNaN(val_hour) && isNaN(val_min)) {
      var d = new Date();
      val_hour = d.getHours();
      val_min = Math.floor(d.getMinutes() / 15) * 15;
   }
   if (callback != null) callback = encodeURIComponent(callback);
   var ret = "";
   ret += "<span id='Host_" + name_hour + "' class='popupwnd' style='display: none;'></span>\r\n";
   ret += "<input type='text' class='timeinput' id='Input_" + name_hour + "' name='Input_" + name_hour + "' value='" + convertTime(val_hour, val_min) + "' size=8 onfocus=\"showTimeInput('" + name_hour + "', '" + name_hour + "', '" + name_min + "', " + (callback == null ? "null" : "'" + callback + "'") + ");\" onkeyup=\"showTimeInput('" + name_hour + "', '" + name_hour + "', '" + name_min + "', " + (callback == null ? "null" : "'" + callback + "'") + ");\" />\r\n";
   ret += "<input type='hidden' id='" + name_hour + "' name='" + name_hour + "' value='" + makeTwoDigits(trim(val_hour)) + "' />\r\n";
   ret += "<input type='hidden' id='" + name_min + "' name='" + name_min + "' value='" + makeTwoDigits(trim(val_min)) + "' />\r\n";
   ret += "<input type='hidden' id='NumRows_" + name_hour + "' name='NumRows_" + name_hour + "' value='7' />\r\n";
   ret += "<input type='hidden' id='Offset_" + name_hour + "' name='Offset_" + name_hour + "' value='0' />";
   ret += "<input type='hidden' id='Referrer_" + name_hour + "' name='Referrer_" + name_hour + "' value='" + (referrer_id == null ? "" : referrer_id) + "' />";
   return ret;
}


function getRichEdit(name) {
   var ret = "";
   ret += "<div id='" + name + "EditorHost'></div>\r\n";
   return ret;
}

var file_types = new Array(
   new Array("image", new Array("gif", "jpg", "jpeg", "png")),
   new Array("audio", new Array("wav", "ogg", "mp3", "flac")),
   new Array("video", new Array("avi", "mov", "mpg", "mpeg", "divx", "swf", "wmv")),
   new Array("web", new Array("htm", "html", "php", "xsl", "css", "js")),
   new Array("doc", new Array("doc", "docx", "csv", "xls", "xlsx", "ppt", "pptx", "pdf", "txt")),
   new Array("data", new Array("xml", "zip", "jar", "gz", "tgz", "rar"))
);

function getFileType(filename) {
   var ext = filename.substr(filename.lastIndexOf(".") + 1).toLowerCase();
   var i = 0, j;
   var found = false;
   while (i < file_types.length && !found) {
      j = 0;
      while (j < file_types[i][1].length && file_types[i][1][j] != ext) j++;
      if (j < file_types[i][1].length) found = true;
      if (!found) i++;
   }
   if (found) {
      return file_types[i][0];
   }
   return "";
}


function getMediaManager(name, width, height, size, root_dir, filters, callback, val) {
   var flist = filters.split(";");
   var flt = new Array();
   var i;
   for (i = 0; i < flist.length; i++) {
      var j, k = 0;
      while (k < file_types.length && flist[i] != file_types[k][0]) k++;
      if (k < file_types.length) {
         for (j = 0; j < file_types[k][1].length; j++) {
            flt[flt.length] = file_types[k][1][j];
         }
      } else {
         flt[flt.length] = flist[i];
      }
   }
   if (width == null) width = 400;
   if (height == null) height = 300;
   if (size == null) size = 50;
   if (root_dir == null) root_dir = "";
   if (filters == null) filters = "";
   var ret = "";
   var force_root = root_dir.indexOf("!");
   if (force_root > -1) {
      force_root = true;
      root_dir = root_dir.substr(1);
   }
   if (size > 0) {
//      ret += "<input type='text' class='mediamgrinput' size='" + size + "' id='Input_" + name + "' name='Input_" + name + "' onfocus=\"try { showMediaManager('" + name + "', this.id, " + width + ", " + height + ", '" + root_dir + "', '" + flt.join(";") + "') } catch(ex) { }\"" + (callback == null ? "" : " onkeyup=\"" + callback + "\"") + " />";
//      ret += "<input type='text' class='mediamgrinput' size='" + size + "' id='Input_" + name + "' name='Input_" + name + "' onfocus=\"try { showMediaManager('" + name + "', this.id, " + width + ", " + height + ", '!', '" + flt.join(";") + "') } catch(ex) { }\"" + (callback == null ? "" : " onkeyup=\"" + callback + "\"") + " />";
//      ret += "<input type='text' class='mediamgrinput' size='" + size + "' id='Input_" + name + "' name='Input_" + name + "' onfocus=\"try { showMediaManager('" + name + "', this.id, " + width + ", " + height + ", '" + (force_root ? root_dir : "!") + "', '" + flt.join(";") + "') } catch(ex) { }\"" + (callback == null ? "" : " onkeyup=\"" + callback + "\"") + " />";
      ret += "<input type='text' class='mediamgrinput' style='width: " + (width - 20) + "px;' id='Input_" + name + "' name='Input_" + name + "' value='" + val + "' onfocus=\"try { showMediaManager('" + name + "', this.id, " + width + ", " + height + ", '" + (force_root ? root_dir : "!") + "', '" + flt.join(";") + "') } catch(ex) { }\"" + (callback == null ? "" : " onkeyup=\"" + callback + "\"") + " />";
   }
   ret += "<input type='hidden' id='" + name + "Selection' name='" + name + "Selection' value='' />";
   ret += "<input type='hidden' id='" + name + "Width' name='" + name + "Width' value='" + width + "' />";
   ret += "<input type='hidden' id='" + name + "Height' name='" + name + "Height' value='" + height + "' />";
   ret += "<input type='hidden' id='" + name + "RefObj' name='" + name + "RefObj' value='' />";
   ret += "<input type='hidden' id='" + name + "RootDirOrig' name='" + name + "RootDirOrig' value='" + root_dir + "' />";
   ret += "<input type='hidden' id='" + name + "RootDir' name='" + name + "RootDir' value='" + (force_root ? root_dir : "!") + "' />";
   ret += "<input type='hidden' id='" + name + "Filters' name='" + name + "Filters' value='" + flt.join(";") + "' />";
   ret += "<input type='hidden' id='" + name + "Callback' name='" + name + "Callback' value=\"" + (callback == null ? "" : encodeURIComponent(callback)) + "\" />";
   ret += "<input type='hidden' id='" + name + "Loaded' name='" + name + "Loaded' value='0' />";
   ret += "<span id='" + name + "FileListIndicator'></span>";
   ret += "<div id='Host_" + name + "' class='popupwnd' style='display: none;'></div>";
   return ret;
}


function getInputPersonal(prefix, val_fname, val_lname, val_phone, val_email, id, non_editable) {
   if (val_fname instanceof Person) {
      val_lname = val_fname.lastname;
      val_phone = val_fname.phone;
      val_email = val_fname.email;
      id = val_fname.id;
      val_fname = val_fname.firstname;
   } else {
      if (val_fname == null) val_fname = "";
      if (val_lname == null) val_lname = "";
      if (val_phone == null) val_phone = "";
      if (val_email == null) val_email = "";
      if (id == null) id = "";
   }
   var ret = "";
   ret += "<input type='hidden' id='" + prefix + "ID' name='" + prefix + "ID' value='" + id + "' />";
   ret += "<table id='" + prefix + "PersonalTable'>\r\n";
   var phone = val_phone.split("-");
   if (non_editable) {
      ret += "<tr><td><input type='hidden' name='" + prefix + "FirstName' id='" + prefix + "FirstName' value='" + val_fname + "' />";
      ret += "<input type='hidden' name='" + prefix + "LastName' id='" + prefix + "LastName' value='" + val_lname + "' />";
      ret += "<input type='hidden' name='" + prefix + "EMail' id='" + prefix + "EMail' value='" + val_email + "' />\r\n";
      ret += formatName(val_fname, val_lname, NAMEFORMAT_FULL) + "<br />";
      ret += getInputPhone(prefix + "PhoneArea", prefix + "PhoneFirst", prefix + "PhoneSecond", prefix + "EMail", phone[0] ? phone[0] : "", phone[1] ? phone[1] : "", phone[2] ? phone[2] : "", null, true);
      ret += "<br />" + val_email + "</td></tr>";
   } else {
      ret += "<tr><td class='label'>First&nbsp;name:</td><td><input type='text' name='" + prefix + "FirstName' id='" + prefix + "FirstName' value='" + val_fname + "' size='40' /></td></tr>\r\n";
      ret += "<tr><td class='label'>Last&nbsp;name:</td><td><input type='text' name='" + prefix + "LastName' id='" + prefix + "LastName' value='" + val_lname + "' size='40' /></td></tr>\r\n";
      ret += "<tr><td class='label'>Phone:</td><td>\r\n";
      ret += getInputPhone(prefix + "PhoneArea", prefix + "PhoneFirst", prefix + "PhoneSecond", prefix + "EMail", phone[0] ? phone[0] : "", phone[1] ? phone[1] : "", phone[2] ? phone[2] : "");
      ret += "</td></tr>\r\n";
      ret += "<tr><td class='label'>E-mail:</td><td><input type='text' name='" + prefix + "EMail' id='" + prefix + "EMail' value='" + val_email + "' size='40' /></td></tr>\r\n";
   }
   ret += "</table>\r\n";
   return ret;
}



function setInputPersonal(prefix, val_fname, val_lname, val_phone, val_email, id) {
   if (val_fname == null) val_fname = "";
   if (val_lname == null) val_lname = "";
   if (val_phone == null) val_phone = "";
   if (val_email == null) val_email = "";
   if (id == null) id = "";
   document.getElementById(prefix + 'ID').value = id;
   document.getElementById(prefix + 'FirstName').value = val_fname;
   document.getElementById(prefix + 'LastName').value = val_lname;
   if (val_phone.length > 0) {
      var phone = val_phone.split("-");
      setInputPhone(prefix + "PhoneArea", prefix + "PhoneFirst", prefix + "PhoneSecond", phone[0], phone[1], phone[2]);
   } else {
      setInputPhone(prefix + "PhoneArea", prefix + "PhoneFirst", prefix + "PhoneSecond");
   }
   document.getElementById(prefix + 'EMail').value = val_email;
}


function setInputAddress(prefix, val_address1, val_address2, val_city, val_state, val_zip) {
   if (document.getElementById(prefix + 'Address1')) {
      if (val_address1 == null) val_address1 = "";
      if (val_address2 == null) val_address2 = "";
      if (val_city == null) val_city = "";
      if (val_state == null) val_state = "";
      if (val_zip == null) val_zip = "";
      document.getElementById(prefix + 'Address1').value = val_address1;
      document.getElementById(prefix + 'Address2').value = val_address2;
      document.getElementById(prefix + 'City').value = val_city;
      if (val_state.length == 0) {
         document.getElementById(prefix + 'State').selectedIndex = 0;
      } else {
         document.getElementById(prefix + 'State').value = val_state;
      }
      document.getElementById(prefix + 'Zip').value = val_zip;
   }
}


function getLoginOrCreateUser(prefix, require_password, fixed, caption) {
   if (fixed == null) fixed = false;
   if (require_password == null) require_password = true;
   if (caption == null) caption = "Username or e-mail address or phone number";
   var ret = "";
   if (require_password) {
      ret += "<table class='panel'>\r\n";
      ret += "<tr><td class='label_normal'>" + caption + ":</td><td><input type='text' id='" + prefix + "UserName' /></td></tr>\r\n";
      ret += "<tr><td class='label_normal'>Password:</td><td><input type='password' id='" + prefix + "Password' /><span id='" + prefix + "UserInfo' style='color: green;'></span></td></tr>\r\n";
      ret += "<tr><td>&nbsp;</td><td><input type='button' class='button_small' value='Check' onclick=\"checkUser('" + prefix + "');\" />&nbsp;<input type='button' class='button_small' value='Clear' onclick=\"setInputPersonal('" + prefix + "');setInputAddress('" + prefix + "');\" />&nbsp;<span id='CreateLoadUserIndicator'></span></td><tr>\r\n";
      ret += "</table>\r\n";
   } else {
      ret += "<p>" + caption + ":<br /><input type='text' id='" + prefix + "UserName' onkeyup=\"checkUserTyping('" + prefix + "', " + (fixed ? "true" : "false") + ");\" />&nbsp;<input type='button' class='button_small' value='Load' onclick=\"createLoadUser(USER_LOAD, '" + prefix + "');\" />&nbsp;<input type='button' class='button_small' value='Clear' onclick=\"setInputPersonal('" + prefix + "');setInputAddress('" + prefix + "');\" />&nbsp;<span id='CreateLoadUserIndicator'></span></p><div id='" + prefix + "UserHintHost' style='display: none;'></div><input type='hidden' id='" + prefix + "PrevTerm' /><input type='hidden' id='" + prefix + "PrevNum' />";
   }
   ret += getInputPersonal(prefix);
   return ret;
}



function validateEMail(email, allow_empty) {
   if (allow_empty == null) allow_empty == false;
   return (!allow_empty && email.length == 0) || (email.length > 0 && (email.indexOf("@") == -1 || email.indexOf(".") == -1)) ? false : true;
}


function validatePhone(area, first, second, allow_empty) {
   if (allow_empty == null) allow_empty == false;
   return (!allow_empty && area.length == 0) || (!allow_empty && first.length == 0) || (!allow_empty && second.length == 0) ? false : true;
}


var CHECK_FNAME = 1,
    CHECK_LNAME = 2,
    CHECK_PHONE = 4,
    CHECK_EMAIL = 8,
    CHECK_NONE = 0x10;
function validateInputPersonal(prefix, check) {
   check_fname = check == null ? true : ((check & CHECK_FNAME) > 0 ? true : false);
   check_lname = check == null ? true : ((check & CHECK_LNAME) > 0 ? true : false);
   check_phone = check == null ? true : ((check & CHECK_PHONE) > 0 ? true : false);
   check_email = check == null ? true : ((check & CHECK_EMAIL) > 0 ? true : false);

   var fname = document.getElementById(prefix + 'FirstName') ? document.getElementById(prefix + 'FirstName').value : "";
   var lname = document.getElementById(prefix + 'LastName') ? document.getElementById(prefix + 'LastName').value : "";
   var area = document.getElementById(prefix + 'PhoneArea') ? document.getElementById(prefix + 'PhoneArea').value : "";
   var phone1 = document.getElementById(prefix + 'PhoneFirst') ? document.getElementById(prefix + 'PhoneFirst').value : "";
   var phone2 = document.getElementById(prefix + 'PhoneSecond') ? document.getElementById(prefix + 'PhoneSecond').value : "";
   var email = document.getElementById(prefix + 'EMail') ? document.getElementById(prefix + 'EMail').value : "";
   if ( (check_fname && fname.length == 0) || (check_lname && lname.length == 0) ||
       (check_phone && (area.length == 0 || isNaN(area) || phone1.length == 0 || isNaN(phone1) || phone2.length == 0 || isNaN(phone2))) ||
       (check_email && !validateEMail(email))) {
      return null;
   }
   return new Array(fname, lname, area, phone1, phone2, email, document.getElementById(prefix + 'ID').value);
}



function validateInputAddress(prefix) {
   var addr1 = document.getElementById(prefix + 'Address1').value;
   var addr2 = document.getElementById(prefix + 'Address2').value;
   var city = document.getElementById(prefix + 'City').value;
   var state = document.getElementById(prefix + 'State').value;
   var zip = document.getElementById(prefix + 'Zip').value;
   if (addr1.length == 0 || city.length == 0 || state == "--" || zip.length == 0 || isNaN(zip)) {
      return null;
   }
   return new Array(addr1, addr2, city, state, zip);
}





function getInputPageTitle(prefix_list, lang, size, parent_dir, val) {
   if (parent_dir == null) parent_dir = "";
   if (val == null) val = "";
   var cr = " cols='" + (size == null ? 40 : size) + "' rows='1'";
   var prefixes = prefix_list.split(",");
   var parents = parent_dir.split(",");
   var onkeyup = new Array();
   var i;
   if (prefixes.length > 1) {
      for (i = 0; i < prefixes.length; i++) {
         onkeyup[onkeyup.length] = "getPageTitle('" + prefixes[i] + "', '" + lang + "', '" + parents[i] + "', '" + prefixes[0] + "')";
      }
   } else {
      onkeyup[onkeyup.length] = "getPageTitle('" + prefixes[0] + "', '" + lang + "', '" + parent_dir + "')";
   }
   size = size == null ? "" : "size='" + size + "'";
   var res = "";
   res += "<textarea style='height: 12pt;' id='" + prefixes[0] + "Title_" + lang + "' name='" + prefixes[0] + "Title_" + lang + "'" + cr + " onkeyup=\"" + onkeyup.join(";") + "\" />" + val + "</textarea><br />\r\n";
   for (i = 0; i < prefixes.length; i++) {
      res += "<div><span id='" + prefixes[i] + "Permalink_" + lang + "' style=\"font-family: 'Tahoma', sans-serif; font-size: 8pt; white-space: nowrap; color: #A5ACB2;\">" + getWebAddress() + "/</span>";
      res += "<input type='text' id='" + prefixes[i] + "EditPermalink_" + lang + "' name='" + prefixes[i] + "EditPermalink_" + lang + "'" + size + " style=\"display: none; background: transparent; font-family: 'Tahoma', sans-serif; font-size: 8pt;\" onchange=\"checkPageTitle('" + prefixes[i] + "', '" + lang + "', '" + parent_dir + "');\" />\r\n";
      res += "<input type='hidden' id='" + prefixes[i] + "PermalinkURL_" + lang + "' />\r\n";
      res += "<input type='hidden' id='" + prefixes[i] + "PermalinkEdited_" + lang + "' value='0' />\r\n</div>\r\n";
   }

   return res;
}


function enablePageTitleEditor(enable, prefix, lang) {
   if (enable) {
      document.getElementById(prefix + 'Permalink_' + lang).title = "Click to edit";
      document.getElementById(prefix + 'Permalink_' + lang).onclick = null;
   } else {
      document.getElementById(prefix + 'Permalink_' + lang).title = "";
      document.getElementById(prefix + 'Permalink_' + lang).onclick = null;
   }
}


function getPageTitle(prefix, lang, parent_dirs, input_id) {
   if (parent_dirs == null) parent_dirs = "";
   if (!document.getElementById(prefix + 'PermalinkEdited_' + lang)) return;
   if (document.getElementById(prefix + 'PermalinkEdited_' + lang).value == 0) {
      var pl = document.getElementById(prefix + 'EditPermalink_' + lang);
      var input = input_id == null ? document.getElementById(prefix + 'Title_' + lang) : document.getElementById(input_id + 'Title_' + lang);
      var host = document.getElementById(prefix + 'Permalink_' + lang);
      toggle(prefix + 'EditPermalink_' + lang, true, 'inline');
      pl.style.width = (input.offsetWidth - host.offsetWidth) + 'px';
      var t = input.value;
      var st = safeFileName(t);
      var pt = "";
      var i;
      if (parent_dirs.length > 0) {
         var pd = parent_dirs.split(",");
         for (i = 0; i < pd.length; i++) {
            var ip = document.getElementById("Topic" + pd[i]);
            var parent = ip ? (document.getElementById(pd[i] + "TopicTitle_" + ip.value + "_" + lang) ? document.getElementById(pd[i] + "TopicTitle_" + ip.value + "_" + lang).value : "") : "";
            pt += parent.length > 0 ? safeFileName(parent) + "/" : "";
         }
      }
      var url = st.length > 0 ? pt.toLowerCase() + st.toLowerCase() + ".html" : "";
      pl.value = url;
      document.getElementById(prefix + 'PermalinkURL_' + lang).value = url;
   }
}



function checkPageTitle(prefix, lang, parent_dir) {
   document.getElementById(prefix + "PermalinkEdited_" + lang).value = 1;
}

function resetPageTitleEditor(prefix, lang) {
   if (lang != null) {
      if (document.getElementById(prefix + "PermalinkEdited_" + lang)) {
         document.getElementById(prefix + 'Permalink_' + lang).innerHTML = getWebAddress() + "/";
         document.getElementById(prefix + 'EditPermalink_' + lang).value = "";
         document.getElementById(prefix + "PermalinkEdited_" + lang).value = 0;
         toggle(prefix + 'EditPermalink_' + lang, true, "none");
      }
   } else {
      var i;
      for (i = 0; i < languages.length; i++) {
         if (document.getElementById(prefix + "PermalinkEdited_" + languages[i].descr)) {
            document.getElementById(prefix + 'Permalink_' + languages[i].descr).innerHTML = getWebAddress() + "/";
            document.getElementById(prefix + 'EditPermalink_' + languages[i].descr).value = "";
            document.getElementById(prefix + "PermalinkEdited_" + languages[i].descr).value = 0;
            toggle(prefix + 'EditPermalink_' + languages[i].descr, true, "none");
         }
      }
   }
}


function getPageTitles(prefix, add_prefix) {
   var i;
   var pts = "";
   for (i = 0; i < languages.length; i++) {
      var ep = document.getElementById(prefix + 'EditPermalink_' + languages[i].descr);
      if (ep) {
         var pt = ep.value;
         if (pt.length > 0) {
            pts += "&pagetitle_" + (add_prefix ? prefix + "_" : "") + languages[i].descr + "=" + encodeURIComponent(pt);
         }
      }
   }
   return pts;
}



/*
   commands: array
   0: label
   1: icon
   2: title
   3: onclick
*/
function addOverlayControls(refobj_id, commands) {
   if (document.getElementById(name + "Controls") || document.getElementById(name + "Ref")) return;

   var i, cmd = "";
   for (i = 0; i < commands.length; i++) {
//      cmd += "<span class='menuitem'" + (commands[i][2] == "" ? "" : " title=\"" + commands[i][2]) + "\" onclick=\"" + commands[i][3] + "\">" + commands[i][0] + (commands[i][1] == "" ? "" : "&nbsp;<img src='webcpms/icons/" + commands[i][1]) + "' />" + "</span><br />";
      cmd += "<span class='menuitem'" + (commands[i][1] == "" ? "" : " style=\"background: url('webcpms/icons/" + commands[i][1] + "') no-repeat right center; padding-right: 16px;\"") + (commands[i][2] == "" ? "" : " title=\"" + commands[i][2]) + "\" onclick=\"" + commands[i][3] + "\">" + commands[i][0] + "</span><br />";
   }
   var refobj = document.getElementById(refobj_id);
   var c = document.createElement("div");
   c.setAttribute("id", refobj_id + "Controls");
   c.style.display = "none";
   c.style.zIndex = "2000";
   c.style.background = "white";
   c.style.textAlign = "center";

   c.innerHTML = cmd;
   c.onmouseout = hideOverlayControls;

   var r = document.createElement("div");
   r.setAttribute("id", refobj_id + "Ref");
   r.style.zIndex = "1000";

   refobj.parentNode.insertBefore(c, refobj.nextSibling);
   refobj.parentNode.insertBefore(r, refobj.nextSibling);

//   refobj.appendChild(c);
//   refobj.appendChild(r);

   refobj.onmouseover = showOverlayControls;
   r.onmouseover = showOverlayControls;

}


function showOverlayControls() {
   var name = this.id.lastIndexOf("Ref") > -1 ? this.id.substr(0, this.id.lastIndexOf("Ref")) : this.id;

   var refobj = document.getElementById(name);
   var pt = Math.round(refobj.offsetHeight / 2 - 15);
   var c = document.getElementById(name + "Controls");
   if (!c) return;
   var r = document.getElementById(name + "Ref");
   if (!r) return;

   r.style.position = c.style.position = "absolute";
   r.style.width = c.style.width = refobj.offsetWidth + "px";
   c.style.height = refobj.offsetHeight - pt + "px";
   r.style.height = refobj.offsetHeight + "px";
//   r.style.left = c.style.left = getElementLeft(refobj) + "px";
   r.style.left = c.style.left = refobj.offsetLeft + "px";
//   r.style.top = c.style.top = getElementTop(refobj) + "px";
   r.style.top = c.style.top = refobj.offsetTop + "px";
   c.style.paddingTop = pt + "px";
   setOpacity(c, 80);
   toggle(name + "Controls", true);
}

function hideOverlayControls() {
   toggle(this.id, false);
}


function reset_msg(host_id) {
   var def = document.getElementById(host_id + 'Default');
   if (def) {
      var host = document.getElementById(host_id);
      setOpacity(host, 100);
      host.className = document.getElementById(host_id + 'Class').value;
      host.innerHTML = decodeURIComponent(def.value);
   }
}

function msg(text, host_id, type) {
   var host = document.getElementById(host_id);
   host.innerHTML = text;
   var oc = document.getElementById(host_id + 'Class');
   if (!oc) {
      oc = document.createElement("input");
      oc.type = "hidden";
      oc.setAttribute("id", host_id + 'Class');
      host.parentNode.insertBefore(oc, host.nextSibling);
   }
   if (host.className != "msg_ok" && host.className != "msg_err") {
      oc.value = host.className;
   } else {
      _fadeCancel(host_id);
      setOpacity(host, 100);
   }
   if (type == "OK") {
      host.className = "msg_ok";
      fadeObject(host_id, -1, 0, 5000, "reset_msg('" + host_id + "');");
   } else {
      host.innerHTML += "&nbsp;[<span class='menuitem' onclick=\"reset_msg('" + host_id + "');\">Hide</span>]";
      host.className = "msg_err";
   }
}



function getProperty(prop, proplist, decode) {
   var _decode = (typeof(decode) == "undefined") ? true : (decode ? true : false);
   var props = proplist.split("|");
   var i = 0;
   var p;
   while (i < props.length) {
      p = props[i].split("=");
      if (p[0] == prop) break;
      i++;
   }
   return i < props.length ? (_decode ? decodeURIComponent(p[1]) : p[1]) : "";
}


function getProperties(proplist) {
   var p = [];
   var props = proplist.split("|");
   var i;
   for (i = 0; i < props.length; i++) {
      p.push(props[i].split("="));
   }
   return p;
}


function setProperty(proplist, new_key, new_val) {
   var p = getProperties(proplist);
   var pl = [];

   var i, found = false;
   for (i = 0; i < p.length; i++) {
      if (p[i][0] == new_key) {
         p[i][1] = new_val;
         found = true;
      }
      pl.push(p[i].join("="));
   }
   if (!found) {
      pl.push([new_key, new_val].join("="));
   }

   return pl.join("|");
}




function join(arr, delim, last_delim) {
   if (arr == null) {
      return "";
   }
   if (delim != null && last_delim == null) last_delim = delim;
   if (delim == null) delim = ",";
   if (last_delim == null) last_delim = ",";
   var i;
   var res = "";
   if (arr.length > 0) {
      if (arr.length > 2) {
         for (i = 0; i < arr.length - 2; i++) {
            res += arr[i] + delim;
         }
         res += arr[arr.length - 2] + last_delim + arr[arr.length - 1];
      } else if (arr.length == 2) {
         res += arr[0] + last_delim + arr[1];
      } else {
         res += arr[0];
      }
   }
   return res;
}


function toggle(id, val, display) {
   var host = document.getElementById(id);
   if (host == null) return;
   if (display == null) display = "block";
   if (val != null) {
      host.style.display = val ? display : "none";
      return;
   }
   host.style.display = host.style.display == display ? "none" : display;
}


function getRandomColor(min, max, thres) {
   var dif = max - min;
   var r = (Math.round(Math.random() * 1000) % dif) + min;
   var g = (Math.round(Math.random() * 1000) % dif) + min;
   var b = (Math.round(Math.random() * 1000) % dif) + min;
   if (r > thres && g > thres && b > thres) {
      var c = Math.round(Math.random() * 10) % 3;
      if (c == 0) r = (Math.round(Math.random() * 1000) % (dif * 0.7)) + (min * 0.8);
         else if (c == 1) g = (Math.round(Math.random() * 1000) % (dif * 0.7)) + (min * 0.8);
         else if (c == 2) b = (Math.round(Math.random() * 1000) % (dif * 0.7)) + (min * 0.8);
   }
   return "rgb(" + r + ", " + g + ", " + b + ")";
}



function mainMenuOver(host) {
   host.style.borderLeft = "solid 4px " + getRandomColor(155, 255, 200);
   host.style.background = "url('webcpms/icons/menu_bg.png') no-repeat bottom left";
}


function mainMenuOut(host) {
   var cur_page = document.getElementById("page").value;
   if (host.id == "menu_" + cur_page) {
      host.style.borderLeft = "solid 4px " + getRandomColor(155, 255, 200);
      host.style.background = "url('webcpms/icons/menu_bg.png') no-repeat bottom left";
   } else {
      host.style.borderLeft = "solid 4px transparent";
      host.style.background = "url('webcpms/icons/menu_sep.png') no-repeat bottom center";
   }
}


function setMainMenuPage() {
   var menuitem = document.getElementById("menu_" + document.getElementById("page").value);
   if (menuitem == null) return;
   if (menuitem.className == "mainmenuitem") {
      mainMenuOver(menuitem);
   }
}


function creditsRollOver(img_id, over, text_style) {
   var img = document.getElementById(img_id);
   if (img) img.src = eval(img_id + (over ? "_on.src" : "_off.src"));
   if (text_style) {
      var text = document.getElementById(img_id + "_text");
      if (text) text.className = over ? text_style + "_hover" : text_style;
   }
}



/**/
function GetXmlHttpObject(ajax_array, key_value) { 
   var objXMLHttp = null;
   if (window.XMLHttpRequest) {
      objXMLHttp = new XMLHttpRequest();
   } else if (window.ActiveXObject) {
      objXMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
   }
   if (ajax_array) {
      ajax_array[ajax_array.length] = new Array(key_value, objXMLHttp);
   }
   return objXMLHttp;
}

function load(xmlHttp, engine, cmd, update) {
   xmlHttp.onreadystatechange = function () {
      if (xmlHttp.readyState != 4) return;
      if (xmlHttp.status != 200 && xmlHttp.status != 304) {
         ajaxNetworkError();
//         return;
      } else {
         toggle('AjaxNetworkErrorHost', false);
      }
      update();
   }
   xmlHttp.open("POST", engine, true);
   try {
      xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
      xmlHttp.setRequestHeader("Content-length", cmd.length);
   } catch (ex) {
   }
   xmlHttp.setRequestHeader("Connection", "close");
   xmlHttp.send(cmd);
}

function getXmlHttpResponse(ajax_array, main_elem_name, key_name) {
   var found = false;
   var n = 0;
   var main_elem = null;
   while (n < ajax_array.length) {
      if (ajax_array[n][1].readyState == 4 || ajax_array[n][1].readyState == "complete") {
         var key_value = "";
         if (main_elem_name) {
            var _xml_doc_ = createXmlDoc(ajax_array[n][1].responseText);
            var main_elems = _xml_doc_.getElementsByTagName(main_elem_name);
            main_elem = main_elems[0];
            var key_elem = findTagByName(main_elem, key_name);
            key_value = key_elem == null ? getElemAttributeValue(main_elem, key_name) : key_elem.childNodes[0].nodeValue;
         } else {
            key_value = getProperty(key_name, ajax_array[n][1].responseText);
            main_elem = ajax_array[n][1].responseText;
         }
         if (key_value == ajax_array[n][0]) {
            ajax_array[n][0] = null;
            found = true;
            break;
         }
      }
      n++;
   }
   return found ? main_elem : null;
}

function flushAjaxResponses(ajax_array) {
   var n = 0;
   var cnt = 0;
   while (n < ajax_array.length) {
      if ((ajax_array[n][1].readyState == 4 || ajax_array[n][1].readyState == "complete") && ajax_array[n][0] == null) {
         cnt++;
      }
      n++;
   }
   if (cnt == n) { // all queries loaded, flush ajax array
      ajax_array.splice(0, ajax_array.length);
   }
}


function ajaxNetworkError() {
   if (!document.getElementById('AjaxNetworkError')) return;
   if (document.getElementById('AjaxNetworkError').value != 1) return;
   var host = document.getElementById('AjaxNetworkErrorHost');
   if (host) {
      toggle('AjaxNetworkErrorHost', true);
   } else {
      var body = document.getElementsByTagName('body');
      host = document.createElement('div');
      host.setAttribute("id", "AjaxNetworkErrorHost");
      host.style.position = 'fixed';
      host.style.right = "0px";
      host.style.top = "0px";
      host.style.width = "100px";
      host.style.height = "auto";
      host.style.background = "red";
      host.style.color = "white";
      host.style.textAlign = "center";
      host.style.zIndex = 99999;
      body[0].appendChild(host);
   }
   host.innerHTML = "Network error<br>[&nbsp;<span class='menuitem' onclick=\"toggle('AjaxNetworkErrorHost', false);\">Close</span>&nbsp;]";
}
/**/


WebCPMSAjax = {

   ajax: [],

   _createXmlHttpObject: function(id, extra) { 
      var objXMLHttp = null;
      if (window.XMLHttpRequest) {
         objXMLHttp = new XMLHttpRequest();
      } else if (window.ActiveXObject) {
         objXMLHttp = new ActiveXObject("Microsoft.XMLHTTP");
      }
      WebCPMSAjax.ajax.push([id, objXMLHttp, extra]);
      return objXMLHttp;
   },



   load: function(engine, cmd, update, xml, extra) {
      if (extra == null) extra = "";

      var id = "WAID_" + (new Date().getTime());

      var xmlHttp = WebCPMSAjax._createXmlHttpObject(id, extra);

      cmd += "&waid=" + id;

      xmlHttp.onreadystatechange = function () {
         if (xmlHttp.readyState != 4) return;
         if (xmlHttp.status != 200 && xmlHttp.status != 304) {
            ajaxNetworkError();
         } else {
            toggle('AjaxNetworkErrorHost', false);
         }
         var r = WebCPMSAjax._getResponse(xml);
         update(r[0], r[1]);
         WebCPMSAjax._flush();
      }

      xmlHttp.open("POST", engine, true);
      try {
         xmlHttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
         xmlHttp.setRequestHeader("Content-length", cmd.length);
      } catch (ex) {
      }
      xmlHttp.setRequestHeader("Connection", "close");
      xmlHttp.send(cmd);
   },



   _getResponse: function(xml) {
      var found = false;
      var n = 0;
      var main_elem = null;
      while (n < WebCPMSAjax.ajax.length) {
         var key_value = "";
         if (xml) {
            var xml_doc = createXmlDoc(WebCPMSAjax.ajax[n][1].responseText);
            main_elem = xml_doc.childNodes[0];
            key_value = getElemAttributeValue(xml_doc.childNodes[0], "waid");
         } else {
            key_value = getProperty("WAID", WebCPMSAjax.ajax[n][1].responseText);
            main_elem = WebCPMSAjax.ajax[n][1].responseText;
         }
         if (key_value == WebCPMSAjax.ajax[n][0]) {
            WebCPMSAjax.ajax[n][0] = null;
            found = true;
            break;
         }
         n++;
      }
      return found ? [main_elem, WebCPMSAjax.ajax[n][2]] : null;
   },

   _flush: function() {
      var n = 0;
      var cnt = 0;
      while (n < WebCPMSAjax.ajax.length) {
         if ((WebCPMSAjax.ajax[n][1].readyState == 4 || WebCPMSAjax.ajax[n][1].readyState == "complete") && WebCPMSAjax.ajax[n][0] == null) {
            cnt++;
         }
         n++;
      }
      if (cnt == n) { // all queries loaded, flush ajax array
         WebCPMSAjax.ajax.splice(0, WebCPMSAjax.ajax.length);
      }
   },

   end: null
};
/**/


function createXmlDoc(xml_text) {
   if (window.ActiveXObject) {
      var doc = new ActiveXObject("Microsoft.XMLDOM");
      doc.async = false;
      doc.loadXML(xml_text);
   } else {
      var parser = new DOMParser();
      var doc = parser.parseFromString(xml_text, "text/xml");
   }
   return doc;
}



function elemSorter(a, b) {
   return a[0] == b[0] ? 0 : (a[0] > b[0] ? 1 : -1);
}

function sortElem(elem) {
   if (elem == null) {
      return null;
   }
   var res = [];
   var i;
   for (i = 0; i < elem.childNodes.length; i++) {
      if (elem.childNodes[i].nodeType != 1) {
         continue;
      }
      res[res.length] = [elem.childNodes[i].tagName, elem.childNodes[i]];
   }
   return res.sort(elemSorter);
}

function getTagByName(elems, tagname) {
   if (elems == null) return null;
   var i, f = 0, l = elems.length - 1;

   var found = null;

   while (!found && f <= l) {
      i = Math.floor((f + l) / 2);
      found = elems[i][0] == tagname ? elems[i] : null;
      if (!found) {
         if (tagname < elems[i][0]) {
            l = i - 1;
         } else {
            f = i + 1;
         }
      }
   }

   return found[1] ? (found[1].childNodes[0] ? found[1].childNodes[0].nodeValue : null) : null;
}


function findTagByName(elem, tagname) {
   if (elem == null) return null;
   var i = 0;
   while (i < elem.childNodes.length && elem.childNodes[i].tagName != tagname) i++;
   if (i < elem.childNodes.length) return elem.childNodes[i];
   return null;
}

function getElemAttributeValue(elem, attr_name) {
   if (elem == null) return null;
   var attr, i = 0;
   while (i < elem.attributes.length && elem.attributes[i].name != attr_name) i++;
   if (i < elem.attributes.length) return elem.attributes[i].value;
   return null;
}

function collectTagsByAttribute(elem, tagname, attr_name) {
   if (elem == null) return null;
   var tags = new Array();
   var i = 0;
   for (i = 0; i < elem.childNodes.length; i++) {
      if (elem.childNodes[i].tagName == tagname) {
         tags[tags.length] = new Array();
         tags[tags.length - 1][0] = getElemAttributeValue(elem.childNodes[i], attr_name);
         tags[tags.length - 1][1] = elem.childNodes[i].childNodes[0].nodeValue;
      }
   }
   return tags;
}


function removeElement(name, idx) {
   var host = document.getElementById(name);
   var elem = document.getElementById(name + '_' + idx);
   host.removeChild(elem);
}

function moveElementUp(name, idx) {
   var host = document.getElementById(name);
   var elem = document.getElementById(name + '_' + idx);

   var prev = elem.previousSibling;
   while ( prev != null && prev.nodeType != 1 ) prev = prev.previousSibling;

   if (prev) {
      host.removeChild(elem);
      host.insertBefore(elem, prev);
   }
}

function moveElementDown(name, idx) {
   var host = document.getElementById(name);
   var elem = document.getElementById(name + '_' + idx);

   var next = elem.nextSibling;
   while ( next != null && next.nodeType != 1 ) next = next.nextSibling;

   if (next) {
      host.removeChild(elem);
      host.insertBefore(elem, next.nextSibling);
   }
}



function startIndicator(host_id, msg, referrer_id) {
   var host = document.getElementById(host_id);
   if (host == null) return;
   if (referrer_id != null) {
      var referrer = document.getElementById(referrer_id);
      var rw = referrer.offsetWidth;
      var rh = referrer.offsetHeight;
      host.className = "indicator_on";
      if (isFloating(referrer)) {
         var rx = referrer.offsetLeft;
         var ry = referrer.offsetTop;
      } else {
         var rx = getElementLeft(referrer);
         var ry = getElementTop(referrer);
      }
      host.style.left = rx + "px";
      host.style.top = ry + "px";
      host.style.width = rw + "px";
      host.style.height = rh + "px";
      host.innerHTML = "<img src='" + getIconDir() + "indicator.gif' width='16' height='16' style='position: relative; top: 35%' /><span style='position: relative; top: 35%'>&nbsp;" + msg + "...</span>";
   } else {
      host.innerHTML = "&nbsp;<img src='" + getIconDir() + "indicator.gif' width='16' height='16' valign='bottom' />&nbsp;" + msg + "...";
   }
}

function stopIndicator(host_id) {
   var host = document.getElementById(host_id);
   if (host == null) return;
   host.innerHTML = "";
   if (host.className == "indicator_on") host.className = "indicator_off";
}



function setButtonVisualStuff() {
   var inputs = document.getElementsByTagName("input");
   var input_btns = new Array();
   var input_btn_sms = new Array();
   var i;
   for (i = 0; i < inputs.length; i++) {
      if (inputs[i].getAttribute("class") == "button") input_btns[input_btns.length] = inputs[i];
      else if (inputs[i].getAttribute("class") == "button_small") input_btn_sms[input_btn_sms.length] = inputs[i];
   }
   for (i = 0; i < input_btns.length; i++) {
      input_btns[i].onmouseover = function () { this.className = "button_hover"; }
      input_btns[i].onmouseout = function () { this.className = "button"; }
      input_btns[i].onmousedown = function () { this.className = "button_down"; }
      input_btns[i].onmouseup = function () { this.className = "button_hover"; }
   }
   for (i = 0; i < input_btn_sms.length; i++) {
      input_btn_sms[i].onmouseover = function () { this.className = "button_small_hover"; }
      input_btn_sms[i].onmouseout = function () { this.className = "button_small"; }
      input_btn_sms[i].onmousedown = function () { this.className = "button_small_down"; }
      input_btn_sms[i].onmouseup = function () { this.className = "button_small_hover"; }
   }
}




function setCookie(c_name, value, expire_sec) {
   var ex = expire_sec == null ? 7 * 86400 * 1000 : expire_sec * 1000;
   var exdate = new Date();
   exdate.setTime(exdate.getTime() + ex);
   document.cookie = c_name + "=" + encodeURIComponent(value) + "; expires=" + exdate + ";path=/";
}


function getCookie(c_name, def_val) {
   if (document.cookie.length > 0) {
      c_start = document.cookie.indexOf(c_name + "=");
      if (c_start != -1) { 
         c_start = c_start + c_name.length + 1;
         c_end = document.cookie.indexOf(";", c_start);
         if (c_end == -1) c_end = document.cookie.length;
         return decodeURIComponent(document.cookie.substring(c_start, c_end));
      } 
   }
   return def_val == null ? "" : def_val;
}


function deleteCookie(c_name) {
   setCookie(c_name, "", -1);
}




function createDownloader(name, engine, params) {
   var fr = document.getElementById(name);
   if (!fr) {
      fr = document.createElement("iframe");
      fr.setAttribute("id", name);
      fr.style.width = "0px";
      fr.style.height = "0px";
      fr.style.display = "none";
      document.body.appendChild(fr);
   }
   var f = "<html><body><form id='" + name + "Form' action='" + engine + "' method='post'>";
   var i;
   if (typeof(params) == "string") {
      var pr = params.split("&");
      for (i = 0; i < pr.length; i++) {
         var p = pr[i].split("=");
         f += "<input type='hidden' id='" + p[0] + "' name='" + p[0] + "' value=\"" + (p[1] ? p[1] : "") + "\" />";
      }
   } else if (typeof(params) == "array") {
      for (i = 0; i < p.length; i++) {
         f += "<input type='hidden' id='" + params[i][0] + "' name='" + params[i][0] + "' value=\"" + params[i][1] + "\" />";
      }
   }
   f += "</form></body></html>";
   var fr = document.getElementById(name).contentWindow.document;
   fr.open();
   fr.write(f);
   fr.close();

   fr.getElementById(name + 'Form').submit();
}


function createFileDownloader(name, file) {
   createDownloader(name, engine_core_process, "cmd=cmdGetFile&sid=" + document.getElementById('SessionID').value + "&filename=" + encodeURIComponent(file));
}


function selectItem(selector_name, item) {
   var selector = document.getElementById(selector_name);
   var i = 0;
   if (!selector) return;
   var len = selector.options.length;
   while (i < len && selector.options[i].value != item) i++;
   if (i >= len) return;
   selector.selectedIndex = i;
}

function addOption(sel_id, value, text) {
   var sel = document.getElementById(sel_id);
   if (sel == null) return;
   var opt = document.createElement("option");
   opt.value = value;
   opt.text = text;
   try {
      sel.add(opt, null);
   } catch (ex) {
      sel.add(opt);
   }
}

function checkBox(checkbox_name, checked) {
   var checkbox = document.getElementById(checkbox_name);
   if (!checkbox) return;
   checkbox.checked = checked == "true";
}


function getCheck(items) {
   var num_items = 0;
   if (items instanceof Array) {
      num_items = items.length;
   }
   var i;

   if (items instanceof Array) {
      for (i = 0; i < num_items; i++) {
         if (document.getElementById(items[i]).checked) {
            return items[i];
         }
      }
   } else {
      var chk;
      i = 0;
      while ( (chk = document.getElementById(items + i)) != null ) {
         if (chk.checked) {
            return i;
         }
         i++;
      }
   }

   return -1;
}

