
function cloneObject(what) {
    for (i in what) {
        this[i] = what[i];
    }
  return this;
}


function interesting_form_element( el )
{
  return el &&
    ( el.nodeName =="INPUT" || 
      el.nodeName =="SELECT" ||
      el.nodeName =="TEXTAREA" );  
}

function copyFormDataTo(fromform, toOb){
   fromFormElements = fromform.elements;
  
   toOb.values = new Array();
   toOb.names = new Array();
   
   for (var i = 0; i < fromFormElements.length; i++) {
        fromFormElement = fromFormElements[i];

        if( interesting_form_element( fromFormElement ) ){
          var val = ( ! el_is_checkbox( fromFormElement ) ? fromFormElement.value 
                                                         : value_from_checkbox( fromFormElement )  );
          
          toOb.values[i] = val;
          toOb.names[i] = fromFormElement.name;
        }
    }

}

function copyFormDataFrom(toform, toOb){
  toformElements = toform.elements;

  for (var i = 0; i < toformElements.length; i++) {
   	toformElement = toformElements[i];
    if( interesting_form_element( toformElement ) ){

      if( el_is_checkbox( toformElement ) )
      {
        set_checkbox_checked_from_value( toformElement, toOb.values[i] )
      }
      else{
          toformElement.value = toOb.values[i] || '';
      }

      if(toformElement.onchange)
      {
        toformElement.onchange();
      }
      
    }
  }

}
function storedFormToQString(Ob){
  var str="";
  var i;
      
  if( Ob.values ){
      for(i in Ob.values){
          str += "&" + Ob.names[i] + "=" + encodeUri(Ob.values[i]); 
      }
  }
  else{
      for( i in Ob ){
          str += '&' + i + '=' + encodeUri( Ob[i]);
      }
  }

  return str;
}
function formToQS(form){
 var qs="";

 for(var i = 0; i<form.length; i++){
    var el = form.elements[i];

    if(el && (el.nodeName=="INPUT" || el.nodeName=="TEXTAREA" 
              || el.nodeName=="SELECT")){
      
      if( el_is_checkbox( el ) ){
          if( el.getAttribute( 'please_use_checkbox_value') ){
              qs += '&' + el.name + "=" + encodeUri( el.checked ? el.value
                                                     : '' );
          }
          else{
              qs += "&" + el.name + "=" + encodeUri(el.checked ? 'on' :
          'off');
          }
      }
      else if ( el.getAttribute( 'type' ) == 'radio'
                || el.getAttribute( 'type' ) == 'RADIO' ) 
      {
        if( el.checked ) 
        {
          qs += '&' + el.name + '=' + el.value;
        }
      }
      else{
        qs += "&" + el.name + "=" + encodeUri(el.value);
      }
     }
 }
 
 return qs;
}
function justCheckedToQS(formid){
 var qs="";
 var form = document.getElementById(formid);

 for(var i = 0; i<form.length; i++){
    var el = form.elements[i];

    if(el && (el.nodeName=="INPUT" || el.nodeName=="TEXTAREA" 
              || el.nodeName=="SELECT")){
      if( el_is_checkbox( el ) &&  el.checked){
        qs += "&" + el.name + "=" + encodeUri('on');
      }
    }
 }

 return qs;;
}
function formToQSById(id){
  return formToQS(document.getElementById(id));
}
function encodeUri(protoUri){

    if( ! encodeURI ){
        var uri = escape(protoUri);
        uri = uri.replace(/\+/g, "%2B");
        return uri;
    }
    else{
        if( encodeURIComponent ){
            return encodeURIComponent( protoUri );
        }
        else{
            return encodeURI( protoUri );
        }
    }
  
}

function selectAllChecks(id){
  var cont = document.getElementById(id);
  
  for(i in cont.elements){
    var el = cont.elements[i];
    if(el && el_is_checkbox( el ) ){
      el.checked=true;
      if(el.onclick){
        el.onclick();
      }
    }
  }
}
function unselectAllChecks(id){
  var cont = document.getElementById(id);
  
  for(i in cont.elements){
    var el = cont.elements[i];
    if(el && el_is_checkbox( el ) ){
      el.checked=false;
      if(el.onclick){
        el.onclick();
      }
    }
  }
}

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      if (oldonload) {
        oldonload();
      }
      func();
    }
  }
}

function extend_js_handler( target, source )
{ 
  if( ! target || typeof target != 'function' ){
      return source;
  }
  else{
    return function(){
        target();
        source();
    }
  }
}

function fake_iframe()
{
  if(!window.fake_iframes){
    window.fake_iframes = 0;
  }
  var id =  'fake_iframe_' + (window.fake_iframes++);

  

  var f = document.createElement('span');
  f.innerHTML = '<iframe style="display:none" src="about:blank" id="'+id+'" name="'+id+'"></iframe>';
  f = f.firstChild;
  document.body.appendChild(f);
  return { frame : f, id : id };
}


function target_fake_iframe(form)
{
    var fakery = fake_iframe();
    form.setAttribute('target', fakery.id);
}

function value_from_checkbox( ch )
{
    if( ch.getAttribute( 'please_use_checkbox_value' ) ){
        if( ch.checked ){
            return ch.value;
        }
        return '';
    }
    
    return ch.checked ? 'on' : 'off';
}
function set_checkbox_checked_from_value( ch, val  )
{
    if( ch.getAttribute( 'please_use_checkbox_value' ) ){
        return ch.checked = ( val.length > 0 );
    }
    return ch.checked = ( val == 'on' ? true : false );
}

function el_is_checkbox( el )
{
  return el && el.type == 'CHECKBOX' || el.type == 'checkbox';
}
function pe_do_stop()
{
  if( window.stop) 
  {
    window.stop();
  }
  else if( document.execCommand )
  {
    document.execCommand('Stop');
  }
  else
  {
    throw 'pe_do_stop: Could not stop';
  }
}

function opacity(id, opacStart, opacEnd, millisec) {
    //speed for each frame
    var speed = Math.round(millisec / 100);
    var timer = 0;

    //determine the direction for the blending, if start and end are the same nothing happens
    if(opacStart > opacEnd) {
        for(i = opacStart; i >= opacEnd; i--) {
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
            timer++;
        }
    } else if(opacStart < opacEnd) {
        for(i = opacStart; i <= opacEnd; i++)
            {
            setTimeout("changeOpac(" + i + ",'" + id + "')",(timer * speed));
            timer++;
        }
    }
}

//change the opacity for different browsers
function changeOpac(opacity, id) {
    var el = document.getElementById(id);
    if( el ){
        changeOpacForEl( opacity, el )
    }
} 

function changeOpacForEl( opacity, el )
{
    var object = el.style;
    object.opacity = (opacity / 100);
    object.MozOpacity = (opacity / 100);
    object.KhtmlOpacity = (opacity / 100);
    object.filter = "alpha(opacity=" + opacity + ")";
}

function fix_table_ab( el )
{
    var rows = el.getElementsByTagName( 'tr' );
    var ab = 0;
    for( var i = 0; i < rows.length ; i++ )
    {
        var is, not;
        if( ab == 0 )
        {
            is = 'rowa';
            not = 'rowb';
        }
        else{
            is = 'rowb';
            not = 'rowa';
        }
        rows[i].className = rows[i].className.replace( is, not );
        ab = 1 - ab;
    }
}

function look_up( el, params ){
    return g_look( el, params, function(el){ return el.parentNode } );
}

function look_down( el, params ){
    params.down = {going_down: true, els : [] }
    return g_look( el, params, function( el ){ __next_el_down( el, params )});
}

function find_all( el, params )
{
    var els = [];
    params.down = {going_down: true, els : [] }
    while( el ){
        if( _found_look_target( el, params ) ){
            els.push( el );
        }
        el = __next_el_down( el, params );
    }
    return els;
}

function __next_el_down(el, params ){
    if( params.down.going_down ){
        params.down.els.push( el );
        if( el.firstChild ){
            return el.firstChild;
        }
    }
    params.down.going_down = false;
    
    if( el.nextSibling ) {
        // dive down the next rabbit hole:
        params.down.going_down = true;
        return el.nextSibling;
    }
    
    return params.down.els.pop();
}
function g_look( el, params, nextNode ){
    while( el && ! _found_look_target( el, params ) ){
        el = nextNode( el, params );
    }
    return el;
}
function _found_look_target( el, params )
{
    if( params.and ){

        for( var i = 0; i < params.and.length; i++ )
        {
            if( ! _found_look_target( el, params.and[ i ] ) ){
                return false;
            }
        }
        return true;
    }


    if( params.tag && el.tagName == params.tag )
    {
        return true;
    }
    if( params.taglist ){
        for ( var i = 0; i < params.taglist.length; i++ )
        {
            if( params.taglist[i] == el.tagName ){
                return true;
            }
        }
    }
    if( params.has_attribute ){
        if( el.getAttribute( params.has_attribute ) ){                        
            return true;
        }
    }
    if( params.code ){
        return params.code( el ) ? true : false;
    }
    return false;
}

var PE_TOOLS_PLOGGING = true;

function plog( stuff ){
    if( PE_TOOLS_PLOGGING && window.console && window.console.log ){
        console.log( stuff );
    }
}

