/* Common global functions */

var o = function(id) { return document.getElementById(id) }

//Capitalize first letter
function ucfirst(str)
{
  return(str.charAt(0).toUpperCase() + str.substr(1));
}

function popup_win(uri, name, option)
{
  if(!name) name = "_blank";
  if(option)
    var win = window.open(uri, name, option);
  else
    var win = window.open(uri, name);
  win.focus();
}

function popup_image(imageUri, width, height)
{
  var option = "scrollbars=yes,resizable=yes,status=no,toolbar=no";
  if(width) option += ",width=" + width;
  if(height) option += ",height=" + height;
   
  var imageView = 
    window.open(imageUri, "imageView", option);
  imageView.focus();
  return false;
}

function regenSecurityImage(name)
{
  var oldUri = xajaxRequestUri;
  xajaxRequestUri = "/:security/ajax";
  var args = new Array(2);
  args[0] = "gen_simg";
  args[1] = name;
  xajax.call("ajax_server", args);
  xajaxRequestUri = oldUri;
  return false;
}

/**
 * @param form Name of the form containing input field
 * @param input The input tag name
 * @param anchor The anchor place where popup is shown
 * @param props The object(associative name-value array) for properties
 * @param div The id of the hidden div tag to hold the popup
 *            (default to window style popup)
 * @param format The date format, default to yyyy-mm-dd
 */
function selectDate(form, input, anchor, props, div, format)
{
  if(!config) var config = new Object();
  if(!format) var format = 'yyyy-MM-dd';

  var fd = eval("document.forms['" + form + "']." + input);
  var cal = null;
  if(div) cal = new CalendarPopup(div);
  else cal = new CalendarPopup();

  //default settings
  cal.offsetY = 5;
  cal.yearSelectStartOffset = 5;
  cal.isShowNavigationDropdowns  = true;
  //cal.setDisplayType("week-end");
  //cal.setDisabledWeekDays(0,1,2);
  //cal.setWeekStartDay(3);
  for(var key in props) {
    cal[key] = props[key];
  }
  cal.select(fd, anchor, format);

  //jsconsole.debug(cal.getCalendar());
  return false;
}

/* Debug window */

function JsConsole()
{
  this.console = null;
}

JsConsole.prototype.htmlspecialchars = function(str) 
{
  str = str.replace(/&/g, '&amp;');
  str = str.replace(/</g, '&lt;');
  str = str.replace(/>/g, '&gt;');
  str = str.replace(/"/g, '&quot;');
 //  str = str.replace(/'/g, '&#039;');
  return str;
}

JsConsole.prototype.debug = function(message, sc)
{
  var w_name = 'debug';
  var w_width = 640;
  var w_height = 480;

  w_attrib  = 'fullscreen=no,toolbar=no,status=no,menubar=no,scrollbars=yes';
  w_attrib += ',resizable=yes,directories=no,location=no,';
  w_attrib += 'width=' + w_width + ',height=' + w_height;

  if (!this.console) {
    this.console = window.open('', w_name, w_attrib);
  }
  this.console.focus();
  this.console.document.write("<pre>-------------------------------<br>");
  if(sc) message = this.htmlspecialchars(message);
  this.console.document.write(message);
  this.console.document.write("</pre>");
}

var jsconsole = new JsConsole();

/* common site level js manager */

function SiteManager()
{
  // initializations
  this.hostname = window.location.hostname;

  // global functions
  this.popupImage = popup_image;
  this.popupWin = popup_win;

  // onLoad callbacks
  this.callbacks = new Array();
}

SiteManager.prototype.onLoad = function()
{
  for(var i=0; i<this.callbacks.length; i++)
    this.callbacks[i]();
}

SiteManager.prototype.registerOnLoadCallbacks = function(callback /* ... */)
{
  for(var i=0; i<arguments.length; i++) {
    this.callbacks[this.callbacks.length] = arguments[i];
  }
}
 
SiteManager.prototype.flipPage = function(form, op, options)
{
  var f = document.forms[form];
  f.op.value = op;

  if(options.ajaxservice) {
    var args = new Array();
    args[0] = options.ajaxservice;
    args[1] = xajax.getFormValues(f);
    xajax.call("ajax_server", args);
    return false;
  } else {
    //synchronous scroll
    f.submit();
  }
}

SiteManager.prototype.refreshPage = function(form, options)
{
  var f = document.forms[form];
  f.op.value = 'refresh';
  if(options.ajaxservice) {
    var args = new Array();
    args[0] = options.ajaxservice;
    args[1] = xajax.getFormValues(f);
    xajax.call("ajax_server", args);
    return false;
  } else {
    f.submit();
  }
}

SiteManager.prototype.pickDate = function(form, input, anchor, div, format)
{
  var props = { 'cssPrefix' : 'cal_' };
  return selectDate(form, input, anchor, props, div, format);
}

SiteManager.prototype.datePicked = function(form)
{
  var f = document.forms[form];
  f.op.value = "date_picked";
  f.submit();
}

SiteManager.prototype.getWeather = function(params)
{
  var args = new Array();
  args[0] = 'get_weather';
  args[1] = xajax.objectToXML(params);
  xajax.call("ajax_server", args);
  return false;
}

SiteManager.prototype.startDragresize = function(key, options)
{
  var moved = {}; 

  if(options == null) 
    options = { handles: [], minLeft: 0, minTop: 0, maxLeft: 1500  };

  var dr = new DragResize('dragresize', options);

  dr.isElement = function(elm)
  {
    if(elm.className && elm.className.indexOf('moveable') > -1) return true;
  }
  dr.isHandle = function(elm)
  {
    if(elm.className && elm.className.indexOf('movehandle') > -1) return true;
  }

  dr.ondragmove = function(isResize) {
    moved[dr.element.id] = true;
  }

  dr.ondragend = function(isResize) {
    //jsconsole.debug("element: "+dr.element.id);
    /*
    jsconsole.debug("elm = ("+dr.elmX+","+dr.elmY+"), mouse = ("+
                    dr.mouseX+","+dr.mouseY+"), lastmouse = ("+dr.lastMouseX+","+dr.lastMouseY+
                    "), mOff = ("+dr.mOffX+","+dr.mOffY+")");
    */
    if(moved[dr.element.id]) {
      var args = new Array(4);
      args[0] = "dragresize";
      args[1] = key;
      args[2] = dr.element.id;
      args[3] = dr.elmX;
      args[4] = dr.elmY;
      xajax.call("ajax_server", args, null, {'uri':'/:site/ajax'});
    }
    return false;
  }

  dr.apply(document);
}

SiteManager.prototype.logout = function(actionurl)
{
  var f = document.forms["header"];
  if(actionurl != null)
    f.actionurl.value = actionurl;
  f.submit();
}

SiteManager.prototype.googleTrack = function()
{
  _uacct = "UA-4834464-4";
  urchinTracker();
}

SiteManager.prototype.actionToggling = function(ele)
{
  $(ele).mouseover(function() { $(this).children("div.action_icons").css("display", "inline") });
  $(ele).mouseout(function() { $(this).children("div.action_icons").css("display", "none") });
}


var sitemgr = new SiteManager();

// onload callback
$(document).ready(function() { sitemgr.onLoad(); });
