// LTrim(string) : Returns a copy of a string without leading spaces.
function ltrim(str)
{
   var whitespace = new String(" \t\n\r");
   var s = new String(str);
   if (whitespace.indexOf(s.charAt(0)) != -1) {
      var j=0, i = s.length;
      while (j < i && whitespace.indexOf(s.charAt(j)) != -1)
         j++;
      s = s.substring(j, i);
   }
   return s;
}

//RTrim(string) : Returns a copy of a string without trailing spaces.
function rtrim(str)
{
   var whitespace = new String(" \t\n\r");
   var s = new String(str);
   if (whitespace.indexOf(s.charAt(s.length-1)) != -1) {
      var i = s.length - 1;       // Get length of string
      while (i >= 0 && whitespace.indexOf(s.charAt(i)) != -1)
         i--;
      s = s.substring(0, i+1);
   }
   return s;
}

// Trim(string) : Returns a copy of a string without leading or trailing spaces
function trim(str) {
   return rtrim(ltrim(str));
}

/**
* Toggles the check state of a group of boxes
*
* Checkboxes must have an id attribute in the form cb0, cb1...
* @param The number of box to 'check'
*/
function checkAll( n ) {
	var f = document.adminForm;
	var c = f.toggle.checked;
	var n2 = 0;
	for (i=0; i < n; i++) {
		cb = eval( 'f.cb' + i );
		if (cb) {
			cb.checked = c;
			n2++;
		}
	}
	if (c) {
		document.adminForm.boxchecked.value = n2;
	} else {
		document.adminForm.boxchecked.value = 0;
	}
}

function uncheckAll( f, elem ) {
 for(i=0;i<f.elements.length;i++)
  if(f.elements[i].type=='radio')
   if(f.elements[i].name==elem)
     f.elements[i].checked=false;
}

function checkAllThird( n, f ) {
	var c = f.toggle.checked;
	var n2 = 0;
	for (i=0; i < n; i++) {
		cb = eval( 'f.cb' + i );
		if (cb) {
			cb.checked = c;
			n2++;
		}
	}
	if (c) {
		f.boxchecked.value = n2;
	} else {
		f.boxchecked.value = 0;
	}
}

function checkAllSecond( c, n, elem ) {

	for (i=0; i < n; i++) {
		cb = eval( 'document.getElementById(\'' + elem + '_cb' + i + '\')' );
		if (cb) {
			cb.checked = c;
		}
	}
}

function listItemTask( id, task ) {
	var f = document.adminForm;
	cb = eval( 'f.' + id );
	if (cb) {
		cb.checked = true;
		submitbutton(task);
	}
	return false;
}

function isChecked(isitchecked){
	if (isitchecked == true){
		document.adminForm.boxchecked.value++;
	}
	else {
		document.adminForm.boxchecked.value--;
	}
}


function isValidEmail(str) {
	var objRegExp  = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/i;
	return objRegExp.test(str);
}

function isValidPhone(str) {
	var objRegExp  = /^([0-9]-)?[0-9]{3}-[0-9]{3}-[0-9]{4}$/i;
	return objRegExp.test(str);
}

function isValidDate(str) {
	var objRegExp  = /^[0-9]{4}-[0-9]{2}-[0-9]{2}$/i;
	return objRegExp.test(str);
}

function isValidPostal(str) {
	var objRegExp  = /^[a-z][0-9][a-z]\s?[0-9][a-z][0-9]$/i;
	return objRegExp.test(str);
}

function isValidPrice(str) {
	var objRegExp  = /^[0-9]+(\.[0-9]{2})?$/i;
	return objRegExp.test(str);
}

function listOneChecked(elem)
{
	if (elem != undefined)
	{
		for( i=0 ; i < elem.length; i++) {
			if (elem[i].checked) {
				return true;
			}
		}
	}
	return false;

}

/**
* Default function.  Usually would be overriden by the component
*/
function submitbutton(pressbutton) {
	submitform(pressbutton);
}

/**
* Submit the admin form
*/
function submitform(pressbutton){
	document.adminForm.task.value=pressbutton;
	try {
		document.adminForm.onsubmit();
		}
	catch(e){}
	document.adminForm.submit();
}

// JS Calendar
var calendar = null; // remember the calendar object so that we reuse
// it and avoid creating another

// This function gets called when an end-user clicks on some date
function selected(cal, date) {
	cal.sel.value = date; // just update the value of the input field
}

// And this gets called when the end-user clicks on the _selected_ date,
// or clicks the "Close" (X) button.  It just hides the calendar without
// destroying it.
function closeHandler(cal) {
	cal.hide();			// hide the calendar

	// don't check mousedown on document anymore (used to be able to hide the
	// calendar when someone clicks outside it, see the showCalendar function).
	Calendar.removeEvent(document, "mousedown", checkCalendar);
}

// This gets called when the user presses a mouse button anywhere in the
// document, if the calendar is shown.  If the click was outside the open
// calendar this function closes it.
function checkCalendar(ev) {
	var el = Calendar.is_ie ? Calendar.getElement(ev) : Calendar.getTargetElement(ev);
	for (; el != null; el = el.parentNode)
	// FIXME: allow end-user to click some link without closing the
	// calendar.  Good to see real-time stylesheet change :)
	if (el == calendar.element || el.tagName == "A") break;
	if (el == null) {
		// calls closeHandler which should hide the calendar.
		calendar.callCloseHandler(); Calendar.stopEvent(ev);
	}
}

// This function shows the calendar under the element having the given id.
// It takes care of catching "mousedown" signals on document and hiding the
// calendar if the click was outside.
function showCalendar(id) {
	var el = document.getElementById(id);
	if (!el.disabled) {
		if (calendar != null) {
			// we already have one created, so just update it.
			calendar.hide();		// hide the existing calendar
			calendar.parseDate(el.value); // set it to a new date
		} else {
			// first-time call, create the calendar
			var cal = new Calendar(true, null, selected, closeHandler);
			calendar = cal;		// remember the calendar in the global
			cal.setRange(1900, 2070);	// min/max year allowed
			calendar.create();		// create a popup calendar
		}
		calendar.sel = el;		// inform it about the input field in use
		calendar.showAtElement(el);	// show the calendar next to the input field

		// catch mousedown on the document
		Calendar.addEvent(document, "mousedown", checkCalendar);
	}
	return false;
}

//--------------------------------------------------------------------------------------

  var timerID = null;

  function getObj(objid) 
  {
    if (document.getElementById)
      return document.getElementById(objid)
    if (document.all)
      return document.all[objid]
    if (document.layers)
      return document.layers[objid]
    return null
  }

  function ScrollUp(elementName, speed, step) 
  {
    var el = getObj(elementName);
	var elPos = parseInt(el.style.top);
	
    if (el != null) 
	{
      if (isNaN(elPos)) 
	  {
        el.style.top = "0px";
      }
      if (elPos < 0) 
	  {
        if ((elPos + step) > 0) 
		{
          el.style.top = "0px";
        }
        else 
		{
          var changePlacement = elPos + step;
		  el.style.top = changePlacement+"px";
        }
      }
      ScrollStop();
      timerID = setTimeout("ScrollUp('" + elementName + "', " + speed + ", " + step + ")", speed);
    }
  }

  function ScrollLeft(elementName, speed, step) 
  {
    var el = getObj(elementName);
	var elPos = parseInt(el.style.left);
	
    if (el != null) 
	{
      if (isNaN(elPos)) 
	  {
        el.style.left = "0px";
      }
      if (elPos < 0) 
	  {
        if ((elPos + step) > 0) 
		{
          el.style.left = "0px";
        }
        else 
		{
          var changePlacement = elPos + step;
		  el.style.left = changePlacement+"px";
        }
      }
      ScrollStop();
      timerID = setTimeout("ScrollLeft('" + elementName + "', " + speed + ", " + step + ")", speed);
    }
  }

  function ScrollDown(elementName, speed, step) 
  {
    var el = getObj(elementName);
	var elPos = parseInt(el.style.top);
	var elParentHeight = el.parentNode.offsetHeight;
	var elHeight = el.offsetHeight;
	
    if (el != null) 	
	{
      if (isNaN(elPos)) 
	  {
        el.style.top = "0px";
      }
      if (elPos > elParentHeight - elHeight) 
	  {
        if ((elPos - step) < elParentHeight - elHeight) 
		{
          var changePlacement = elParentHeight - elHeight;
		  el.style.top = changePlacement+"px";
        }
        else 
		{
          var changePlacement = elPos - step;
		  el.style.top = changePlacement+"px";
        }
      }
      ScrollStop();
      timerID = setTimeout("ScrollDown('" + elementName + "', " + speed + ", " + step + ")", speed);
    }
  }

  function ScrollRight(elementName, speed, step) 
  {
    var el = getObj(elementName);
	var elPos = parseInt(el.style.left);
	var elParentWidth = el.parentNode.offsetWidth;
	var elWidth = el.offsetWidth;
	
    if (el != null) 	
	{
      if (isNaN(elPos)) 
	  {
        el.style.left = "0px";
      }
      if (elPos > elParentWidth - elWidth) 
	  {
        if ((elPos - step) < elParentWidth - elWidth) 
		{
          var changePlacement = elParentWidth - elWidth;
		  el.style.left = changePlacement+"px";
        }
        else 
		{
          var changePlacement = elPos - step;
		  el.style.left = changePlacement+"px";
        }
      }
      ScrollStop();
      timerID = setTimeout("ScrollRight('" + elementName + "', " + speed + ", " + step + ")", speed);
    }
  }

  function ScrollStop() {
    if (timerID != null) {
      clearTimeout(timerID);
      timerID = null;
    }
  }


//--------------------------------------------------------------------------------------  

var http_request = false;
function makeRequest(url, parameters, alertbox) {
  http_request = false;
  if (window.XMLHttpRequest) { // Mozilla, Safari,...
	 http_request = new XMLHttpRequest();
	 if (http_request.overrideMimeType) {
		// set type accordingly to anticipated content type
		//http_request.overrideMimeType('text/xml');
		http_request.overrideMimeType('text/html');
	 }
  } else if (window.ActiveXObject) { // IE
	 try {
		http_request = new ActiveXObject("Msxml2.XMLHTTP");
	 } catch (e) {
		try {
		   http_request = new ActiveXObject("Microsoft.XMLHTTP");
		} catch (e) {}
	 }
  }
  if (!http_request) {
	 alert('Cannot create XMLHTTP instance');
	 return false;
  }
  http_request.onreadystatechange = function()
   {
	  if (http_request.readyState == 4) {
		 if (http_request.status == 200) {
			//alert(http_request.responseText);
			result = http_request.responseText;
			document.getElementById(alertbox).innerHTML = result;            
		 } else {
			alert('There was a problem with the request.');
		 }
	  }
   }
  http_request.open('GET', url + parameters, true);
  http_request.send(null);
}

function buildQuery(form) {
  var a=[],i,o,ignored=/button|image|reset/i,toggled=/checkbox|radio/i;
  for(i=0;(o=form.elements[i]);i++){
	if(o.disabled||!o.name||ignored.test(o.type))continue;
	switch(o.tagName.toLowerCase()){
	  case "input":
		if(toggled.test(o.type)){
		  if(o.checked)
		  a[a.length] = [o.name, o.value||"on"];
		} else if(o.value)
		  a[a.length] = [o.name, o.value];
		break;
	  case "select":
		if(!o.options.length||o.selectedIndex==-1)continue;
		var c=o.options[o.selectedIndex],v=[];
		if(!o.multiple)v=[c.value||c.text];else {
		  for(var j=0;(c=o.options[j]);j++)
			if(c.selected) // optional: && !c.disabled
			  v[v.length]=(c.value||c.text);
		}
		if(v.length)a[a.length] = [o.name, v.join(', ')];
		break;
	  default:
		if(o.value)a[a.length] = [o.name, o.value];
	}
  }
  for(i=0;i<a.length;i++)
	a[i] = encodeURIComponent(a[i][0]) +"="+ encodeURIComponent(a[i][1]);
  return "?"+ a.join("&");
}

function get(obj, locasi, alertbox) {
  var getlist = buildQuery(obj);
  //assuming obj is a form object
  makeRequest(locasi, getlist, alertbox);
}

function toggleFold(elem) {

	if (document.getElementById)
	{
		var style2 = document.getElementById(elem).style;
	}
	else if (document.all)
	{
		var style2 = document.all[elem].style;
	}
	else if (document.layers)
	{
		var style2 = document.layers[elem].style;
	}

	if (style2.display)
	{
		style2.display = "";
		document.cookie = 'folds_'+elem+'=1';
		return false;
	} else {
		style2.display = "none";
		document.cookie = 'folds_'+elem+'=0';
		return true;
	}

}