/**
if (document.body.__defineGetter__) {
  if (HTMLElement) {
    var element = HTMLElement.prototype;
    if (element.__defineGetter__) {
      element.__defineGetter__("outerHTML",
      function () {
      var parent = this.parentNode;
      var el = document.createElement(parent.tagName);
      el.appendChild(this);
      var shtml = el.innerHTML;
      parent.appendChild(this);
      return shtml;
      }
      );
    }
  }
}
*/

/**
 * tinyMCE edit callback. Make the ajax request to 
 * save the code.
 *
 */
function editSave()
{
  var form =$('edit-form');
  var str=form.serialize();

  new Ajax.Request('update.php',
      {
        method: 'post',
        postBody:  str,
        onFailure: function () {
          alert("Failed Request");
        },
        onSuccess: function(response) {
          if (response.headerJSON !=null) 
          {
	    if (response.headerJSON.update == "success") {
	        $('edit-div').addClassName("hidden");        
	        location.reload(); /* work fine on firefox ... good */
	    } else
	    {
	        alert("Failed update :"+response.headerJSON.reason);
	    }
	  } else {
	      alert("No JSON response aie:"+reponse.responseText);
	  }
	}
      });

}
/**
 * \brief Cancel callback for tinyMCE
 * 
 */
function editCancel()
{ 
  $('edit-div').addClassName("hidden");        
}

function editUpdateForm(ob,action,elem)
{
     var lang = ob.readAttribute('edit-lg');
     var type = ob.readAttribute('edit-type');
     var elpos =ob.readAttribute('edit-pos');
     if (type == "title" | type=="h1" | type=="h2") {
       $('edit-old').setValue(elem.childNodes[4].nodeValue);
     } 
     else if (type == "enum") {
         var e=document.createElement('ul');
         e.appendChild(e.cloneNode(true));
         for( var x = 0; elem.childNodes[x]; x++ ) {
             var fils = elem.childNodes[x];
             //alert("have:"+ x + " tg="+elem.childNodes[x].nodeType +"-" + typeof(elem.childNodes[x]));    
             if (fils.nodeType == 3) continue; 
             if ( fils.innerHTML 
                 && ! Element.hasClassName(fils,'remove') 
                 && ! $(fils).hasClassName('add') 
                 && ! $(fils).hasClassName('edit') 
                 ) {
                 if (elem.childNodes[x].innerHTML ) {
                   var el = document.createElement(elem.childNodes[x].tagName);
                   el.appendChild(elem.childNodes[x].cloneNode(true)); 
                   e.firstChild.appendChild(elem.childNodes[x].cloneNode(true));
                 }
              }
         }
       $('edit-old').setValue(e.innerHTML);
     } else
       $('edit-old').setValue(elem.innerHTML);
     $('edit-action').setValue(action);
     $('edit-eltype').setValue(type);
     $('edit-lang').setValue(lang);
     $('edit-pos').setValue(elpos);
}
/**
 * \brief walk through all tags and init class elements with the right features.
 * Specially add,remove,edit class.
 */
function initEdit()
{
  /* Attach handlers to edit */
  $$('a.edit').each( function(el) {
     el.path= el.href;
     el.href = '#';
     Element.observe(el,'click', function (event) {
	     var elem = $(this.readAttribute('edit-id'));
       var type = this.readAttribute('edit-type');
	     editUpdateForm(this,"EDIT_REQUEST",elem);
	     if ($('edit-div').hasClassName("hidden")) {
	        $('edit-div').removeClassName("hidden");        
	     }
       if (type=="title" || type=="h1" || type=="h2" || type=="h3")
       {
           var content = elem.childNodes[4].nodeValue;
	         tinyMCE.get('edit-content').setContent(content,{format: 'html'});
       } else if (type =="enum" )
       {
         var e = document.createElement(elem.tagName);
         e.appendChild(e.cloneNode(true));
         var res="";
         
         for( var x = 0; elem.childNodes[x]; x++ ) {
             var fils = elem.childNodes[x];
             //alert("have:"+ x + " tg="+elem.childNodes[x].nodeType +"-" + typeof(elem.childNodes[x]));    
             if ( fils.innerHTML 
                 && ! Element.hasClassName(fils,'remove') 
                 && ! $(fils).hasClassName('add') 
                 && ! $(fils).hasClassName('edit') 
                 ) {

                 if (elem.childNodes[x].innerHTML ) {
                   var el = document.createElement(elem.childNodes[x].tagName);
                   el.appendChild(elem.childNodes[x].cloneNode(true)); 
                   e.firstChild.appendChild(elem.childNodes[x].cloneNode(true));
                   //e.appendChild(elem.childNodes[x].cloneNode(true));
                 }
             } else if (elem.childNodes[x].nodeType == 3) {
                   e.firstChild.appendChild(elem.childNodes[x].cloneNode(true));
             }
         }
         //alert(e.innerHTML);
	       tinyMCE.get('edit-content').setContent(e.innerHTML,{format: 'html'});
       } else {
         //alert(elem.tagName+" "+elem.innerHTML);
         tinyMCE.get('edit-content').setContent(elem.innerHTML,{format: 'html'});
       }
     });
  });
  /* The remove callback function */
  $$('a.remove').each( function(el) {
     el.path= el.href;
     el.href = '#';
     Element.observe(el,'click', function (event) {
	     var elem = $(this.readAttribute('edit-id'));
	     editUpdateForm(this,"REMOVE_REQUEST",elem);
	     if (!$('edit-div').hasClassName("hidden")) {
	        $('edit-div').addClassName("hidden");        
	     }
	     editSave(); /* Convenient purpose*/

     });
  });

  $$('a.add').each( function(el) {
     el.path= el.href;
     el.href = '#';
     Element.observe(el,'click', function (event) {
	     var elem = $(this.readAttribute('edit-id'));
	     editUpdateForm(this,"ADD_REQUEST",elem);
	     if (!$('edit-div').hasClassName("hidden")) {
	        $('edit-div').addClassName("hidden");        
	     }
	     editSave(); /* Convenient purpose */
     });
  });
}
/**
 *
 * LOGIN stuff, do not mixe, with edit functions.
 *
 */
function getPageSize()
{
 var xScroll, yScroll;
		
		if (window.innerHeight && window.scrollMaxY) {	
			xScroll = window.innerWidth + window.scrollMaxX;
			yScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			xScroll = document.body.scrollWidth;
			yScroll = document.body.scrollHeight;
		} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
			xScroll = document.body.offsetWidth;
			yScroll = document.body.offsetHeight;
		}
		
		var windowWidth, windowHeight;
		
		if (self.innerHeight) {	// all except Explorer
			if(document.documentElement.clientWidth){
				windowWidth = document.documentElement.clientWidth; 
			} else {
				windowWidth = self.innerWidth;
			}
			windowHeight = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) { // other Explorers
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
		}	
		
		// for small pages with total height less then height of the viewport
		if(yScroll < windowHeight){
			pageHeight = windowHeight;
		} else { 
			pageHeight = yScroll;
		}
	
		// for small pages with total width less then width of the viewport
		if(xScroll < windowWidth){	
			pageWidth = xScroll;		
		} else {
			pageWidth = windowWidth;
		}

		return [pageWidth,pageHeight];


}

function showLogin() {
 var test=$("generic_login_div");
 var password=$("passwd");
 password.setValue("");
  if ( Element.hasClassName(test,"hidden") == true ) {
    var r=Element.getDimensions($("conteneur"));
    var bg=$("clsLoginGrey");
    var sz= getPageSize();
    Element.setStyle(bg,$H({height: sz[1]+'px',width: sz[0] +'px',display:"block"}));
    Element.removeClassName(bg,"hidden");
    bg.show();
    test.hide();
    //new Effect.Appear(bg);
    new Effect.Appear($("generic_login_div")); 
    Element.removeClassName(test,"hidden");
  }
}

function hideLogin() {
  if (!$('generic_login_div').hasClassName('hidden')) {
    var bg=$('clsLoginGrey');
      new Effect.Fade('generic_login_div',{
        afterFinish: function () {
          $('generic_login_div').addClassName('hidden');
          $('clsLoginGrey').addClassName('hidden');
        }
      });
      $('generic_login_div').removeClassName('hidden');
  }
  
}


function showLoginWithRedirect(redirect) {
  new Insertion.After($('generic_login_form'),"<input type='hidden' name='redirect' value='"+redirect+">");
  showLogin();
}

/**
 *
 *
 */
function doLogoutRequest() 
{
  var form =$('generic_login_form');
  $("action").setValue("LOGOUT_REQUEST");
  var str=form.serialize();

  new Ajax.Request('app/member/login.php',
      {
        method: 'post',
        postBody:  str,
        onFailure: function () {
          alert("Failed Request");
        },
        onSuccess: function(response) {
          try {
	    $('logout').addClassName('hidden');
	    } catch (e) {};
          location.reload(); /**/
	}
      });

}
/**
 *
 *
 */
function doLoginRequest() {
  var form          = $('generic_login_form');
  var security_code = $('security_code');
  var email         = $('email');
  var password      = $("passwd");
  var res           = MD5(email.getValue()+"*"+security_code.getValue()+"*"+password.getValue());
  var url           = window.location.href;
  password.setValue(res);
  $("action").setValue("LOGIN_REQUEST");
  var str           = form.serialize();
  new Ajax.Request('app/member/login.php',
      {
        method: 'post',
        postBody:  str,
        onFailure: function () {
          alert("Failed Request");
        },
        onSuccess: function(response) {
          if (response.headerJSON !=null) 
          {
	    if (response.headerJSON.login == "success") {
              $('generic_login_response').update("success "+response.headerJSON.reason);
	      try {
	        $('logout').removeClassName('hidden');
	        $('member').hide();
	        $('member').addClassName('hidden');
		} catch (e) {};
	      window.location.href = url;
              window.location.replace(url); /**/
	      location.reload(); /* work fine on firefox ... good */
              hideLogin();
	    } else {
              alert("Failed Request");
	      password.setValue("");
              $('generic_login_response').update("Failed json header "+response.headerJSON.reason+" try again");
	    }
          } else {
            alert("Failed Request");
            $('generic_login_response').update("Failed "+response.responseText);
          }
        }
      });
}

/**
 * Look for elements with class login redirect and for elements
 * with class logout.
 */
function initLogins() {
	try {
  $$('a.login').each( function(el) {
    if (Element.hasClassName(el,'redirect')) el.redirect = el.href;
    else el.redirect = '';
    el.href = '#';
    Element.observe(el,'click', function (event) {
      showLoginWithRedirect(this.redirect);
    });
  });
	} catch (e) {};
  try {
    Element.observe($('logout'),'click', function (event) {
      doLogoutRequest();
    });
  } catch (e) {};
  /**/
  $$('a.logout').each(function(el) { 
      Element.observe(el,'click', function (event) {
      doLogoutRequest();
      });
  });
}
/**
 * Main entry point wich initialized all classes and objects
 */
Event.observe(window,'load',function () {try {initLogins();} catch (e){};initEdit();});
/*
 * vim:et:sw=2:ts=2:encoding=utf-8
 */
