
/*
 * jFastMenu
 * see http://code.google.com/p/jfastmenu/
 * */
jQuery.jFastMenu = function(id){

	$(id + ' ul li').mouseover(function(){
		$(this).find('ul:first').css('display', 'block');
	}).mouseout(function(){
		$(this).find('ul:first').css('display', 'none');
	});
};
/* jfastmenu end */



/* minitabs extended
 * see http://code.google.com/p/minitabs
 * param hide: hides the tabs when clicked again on the active tab
 */
jQuery.fn.minitabs = function(hide,speed,effect) {
  id = "#" + this.attr('id');
  $(id + ">DIV:gt(0)").hide();
  $(id + ">DIV:first").show();
  $(id + ">UL>LI>A:first").addClass("current");
  $(id + ">UL>LI>A").click(
    function(){
    	if ( $(this).hasClass("current") && hide) {
    		$(id + ">UL>LI>A").removeClass("current");
    		$(id + ">DIV").hide();
    		return false;
    	}
      $(id + ">UL>LI>A").removeClass("current");
      $(this).addClass("current");
      $(this).blur();
      var re = /([_\-\w]+$)/i;
      var target = $('#' + re.exec(this.href)[1]);
      var old = $(id + ">DIV");
      switch (effect) {
        case 'fade':
          old.fadeOut(speed).fadeOut(speed);
          target.fadeIn(speed);
          break;
        case 'slide':
          old.slideUp(speed);  
          target.fadeOut(speed).fadeIn(speed);
          break;
        case 'none': 
        	old.hide(); 
        	target.show(); 
        	break; 
        default : 
          old.hide(speed);
          target.show(speed);
      }
      return false;
    }
 );
};
/* minitabs end */



/**
 * this function registeres a one click event at element
 * a click at the element, loads the url and applies it to the element linked via href
 * 
 * if the optional loadingPicture is given, this image will be shown while loading
 */
function loadOnRequest( element, url, loadingPicture, target) {
	$(element).click(function(){return false;});
	$(element).one("click", function(){
		if (!target) {
			target = $(element).attr('href');
		}
		if (loadingPicture) {
			$(target).html( '<img src="'+loadingPicture+'" /> please wait ...');
		}
		else {
			$(target).html('<img src="/pic/loading.gif" /> please wait ...');
		}
		
	   	// call url and apply returned data
		$.get( url, 
	  	    function(data){
	  	      $(target).html(data);
	  	    }
	  	);
    });
}

/**
 * Yes, its not a typo: zcrollTo, since scrollTo is already given
 * @param to
 * @returns {Boolean}
 */
function zcrollTo( to) {
	$(window).scrollTop($(to).offset().top);
	return false;
}

/**
 * sends data of a form to an url
 * @param formName: name of the form to send
 * @param url: url to send data to
 * @param target: element id to place the return 
 * @return
 */
function cnSendForm( formName, url, target) {
	// post form data
	$.post( url,
			$( formName).serialize(), 
			    function(data){
			      $(target).html(data);
			    }
			);
	// show loading picture
	$( target).html('<img src=\'/pic/loading.gif\' /> please wait ...');
}


/* CNRating */

/**
* creates the rating object
*/
function CNRating(
	ratingElementId,
	maxStars,
	objectName,
	formName,
	ratingMessageId,
	componentSuffix,
	messages,
	starCount,
	callback)
{
	this.ratingElementId=ratingElementId;
	this.maxStars=maxStars;
	this.objectName=objectName;
	this.formName=formName;
	this.ratingMessageId=ratingMessageId
	this.componentSuffix=componentSuffix
	this.messages=messages;
	this.callback=callback;
	this.starTimer=null;
	this.starCount=0;
	this.enabled=true;
	if(starCount){
		this.starCount=starCount;
		var that=this;
		$(document).ready(function() {
			that.drawStars(that.starCount,true);
		});
	}
}

/**
* initialize object properties
*/
CNRating.prototype.ratingElementId=null;
CNRating.prototype.maxStars=null;
CNRating.prototype.objectName=null;
CNRating.prototype.formName=null;
CNRating.prototype.ratingMessageId=null;
CNRating.prototype.componentSuffix=null;
CNRating.prototype.messages=null;
CNRating.prototype.callback=null;
CNRating.prototype.starTimer=null;
CNRating.prototype.starCount=null;
CNRating.prototype.savedMessage=null;

/**
* shows number of stars 
*/
CNRating.prototype.showStars=function(starNum,skipMessageUpdate){
	if ( this.enabled==false) {
		return;
	}
	this.clearStarTimer();
	this.greyStars();
	this.colorStars(starNum);
	if(!skipMessageUpdate)
		this.setMessage(starNum,this.messages);
};

/**
* set message according to star
*/
CNRating.prototype.setMessage=function(starNum){

	if(starNum>0){
		if(!this.savedMessage){
			this.savedMessage=$('#'+this.ratingMessageId).html();
		}
		$('#'+this.ratingMessageId).html(this.messages[starNum-1]);
	}
  else if(this.savedMessage){
			$('#'+this.ratingMessageId).html(this.savedMessage);
	}
};

CNRating.prototype.colorStars=function(starNum){
	var fullStars=Math.floor(starNum+0.25);

	var halfStar=(starNum-fullStars>0.25);
	for(var i=0;i<fullStars;i++){
	   $('#'+'star_'+this.componentSuffix+"_"+(i+1)).removeClass(CNRating.ut_rating_img_half);
	   $('#'+'star_'+this.componentSuffix+"_"+(i+1)).removeClass(CNRating.ut_rating_img_bg);
	   $('#'+'star_'+this.componentSuffix+"_"+(i+1)).addClass(CNRating.ut_rating_img);
	}
	if(halfStar){
	   $('#'+'star_'+this.componentSuffix+"_"+(i+1)).removeClass(CNRating.ut_rating_img);
	   $('#'+'star_'+this.componentSuffix+"_"+(i+1)).removeClass(CNRating.ut_rating_img_bg);
	   $('#'+'star_'+this.componentSuffix+"_"+(i+1)).addClass(CNRating.ut_rating_img_half);
	}
};


CNRating.prototype.greyStars=function(){
	for(var i=0;i<this.maxStars;i++){
	   $('#'+'star_'+this.componentSuffix+"_"+(i+1)).removeClass(CNRating.ut_rating_img);
	   $('#'+'star_'+this.componentSuffix+"_"+(i+1)).removeClass(CNRating.ut_rating_img_half);
	   $('#'+'star_'+this.componentSuffix+"_"+(i+1)).addClass(CNRating.ut_rating_img_bg);
	}
};

/**
* sets the stars from the rating
*/
CNRating.prototype.setStars=function(starNum){
	if ( this.enabled==false) {
		return;
	}
	
	this.starCount=starNum;
	this.drawStars(starNum);
	
	var ratingMessageId=this.ratingMessageId;
	
	// add rating to the form
	document.forms[this.formName]['rating'].value=this.starCount;
	var form=document.forms[this.formName];
	
	// disable any further rating
	this.disable();

	// extract params
	var formData = $('#'+this.formName).serialize();
	
	// send form and install callback
	$.get( form.action+'?'+formData, 
	    function(data){
	      $('#'+ratingMessageId).html(data);
	    }
	);
};

CNRating.prototype.drawStars=function(starNum,skipMessageUpdate){
	this.starCount=starNum;
	this.showStars(starNum,skipMessageUpdate);
};

/**
* called from onmouseout
* clear the stars
*/
CNRating.prototype.clearStars=function(){
	if ( this.enabled==false) {
		return;
	}
	this.starTimer=window.setTimeout(this.objectName+".resetStars()",300);
};


CNRating.prototype.resetStars=function(){
	this.clearStarTimer();
	if(this.starCount)
		this.drawStars(this.starCount);
	else
		this.greyStars();
	this.setMessage(0);
};


CNRating.prototype.clearStarTimer=function(){
	if(this.starTimer){
		window.clearTimeout(this.starTimer);
		this.starTimer=null;
	}
};

/**
 * disables the rating component
 * called from within setStars 
 */
CNRating.prototype.disable=function(){
	this.enabled = false;

};

CNRating.prototype.enable=function(){
	this.enabled = true;
};

/**
 * class definitions
 */
CNRating.ut_rating_img='icn_star_full_large';
CNRating.ut_rating_img_half='icn_star_half_large';
CNRating.ut_rating_img_bg='icn_star_empty_large';

/* CNRating end */





/* Nifty Corners Cube - rounded corners with CSS and Javascript
Copyright 2006 Alessandro Fulciniti (a.fulciniti@html.it)

This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*/

var niftyOk=(document.getElementById && document.createElement && Array.prototype.push);
var niftyCss=false;

String.prototype.find=function(what){
return(this.indexOf(what)>=0 ? true : false);
}

var oldonload=window.onload;
if(typeof(NiftyLoad)!='function') NiftyLoad=function(){};
if(typeof(oldonload)=='function')
    window.onload=function(){oldonload();AddCss();NiftyLoad()};
else window.onload=function(){AddCss();NiftyLoad()};

function AddCss(){
niftyCss=true;
var l=CreateEl("link");
l.setAttribute("type","text/css");
l.setAttribute("rel","stylesheet");
l.setAttribute("href","niftyCorners.css");
l.setAttribute("media","screen");
//document.getElementsByTagName("head")[0].appendChild(l);
}

function Nifty(selector,options){
if(niftyOk==false) return;
if(niftyCss==false) AddCss();
var i,v=selector.split(","),h=0;
if(options==null) options="";
if(options.find("fixed-height"))
    h=getElementsBySelector(v[0])[0].offsetHeight;
for(i=0;i<v.length;i++)
    Rounded(v[i],options);
if(options.find("height")) SameHeight(selector,h);
}

function Rounded(selector,options){
var i,top="",bottom="",v=new Array();
if(options!=""){
    options=options.replace("left","tl bl");
    options=options.replace("right","tr br");
    options=options.replace("top","tr tl");
    options=options.replace("bottom","br bl");
    options=options.replace("transparent","alias");
    if(options.find("tl")){
        top="both";
        if(!options.find("tr")) top="left";
        }
    else if(options.find("tr")) top="right";
    if(options.find("bl")){
        bottom="both";
        if(!options.find("br")) bottom="left";
        }
    else if(options.find("br")) bottom="right";
    }
if(top=="" && bottom=="" && !options.find("none")){top="both";bottom="both";}
v=getElementsBySelector(selector);
for(i=0;i<v.length;i++){
    FixIE(v[i]);
    if(top!="") AddTop(v[i],top,options);
    if(bottom!="") AddBottom(v[i],bottom,options);
    }
}

function AddTop(el,side,options){
var d=CreateEl("b"),lim=4,border="",p,i,btype="r",bk,color;
d.style.marginLeft="-"+getPadding(el,"Left")+"px";
d.style.marginRight="-"+getPadding(el,"Right")+"px";
if(options.find("alias") || (color=getBk(el))=="transparent"){
    color="transparent";bk="transparent"; border=getParentBk(el);btype="t";
    }
else{
    bk=getParentBk(el); border=Mix(color,bk);
    }
d.style.background=bk;
d.className="niftycorners";
p=getPadding(el,"Top");
if(options.find("small")){
    d.style.marginBottom=(p-2)+"px";
    btype+="s"; lim=2;
    }
else if(options.find("big")){
    d.style.marginBottom=(p-10)+"px";
    btype+="b"; lim=8;
    }
else d.style.marginBottom=(p-5)+"px";
for(i=1;i<=lim;i++)
    d.appendChild(CreateStrip(i,side,color,border,btype));
el.style.paddingTop="0";
el.insertBefore(d,el.firstChild);
}

function AddBottom(el,side,options){
var d=CreateEl("b"),lim=4,border="",p,i,btype="r",bk,color;
d.style.marginLeft="-"+getPadding(el,"Left")+"px";
d.style.marginRight="-"+getPadding(el,"Right")+"px";
if(options.find("alias") || (color=getBk(el))=="transparent"){
    color="transparent";bk="transparent"; border=getParentBk(el);btype="t";
    }
else{
    bk=getParentBk(el); border=Mix(color,bk);
    }
d.style.background=bk;
d.className="niftycorners";
p=getPadding(el,"Bottom");
if(options.find("small")){
    d.style.marginTop=(p-2)+"px";
    btype+="s"; lim=2;
    }
else if(options.find("big")){
    d.style.marginTop=(p-10)+"px";
    btype+="b"; lim=8;
    }
else d.style.marginTop=(p-5)+"px";
for(i=lim;i>0;i--)
    d.appendChild(CreateStrip(i,side,color,border,btype));
el.style.paddingBottom=0;
el.appendChild(d);
}

function CreateStrip(index,side,color,border,btype){
var x=CreateEl("b");
x.className=btype+index;
x.style.backgroundColor=color;
x.style.borderColor=border;
if(side=="left"){
    x.style.borderRightWidth="0";
    x.style.marginRight="0";
    }
else if(side=="right"){
    x.style.borderLeftWidth="0";
    x.style.marginLeft="0";
    }
return(x);
}

function CreateEl(x){
return(document.createElement(x));
}

function FixIE(el){
if(el.currentStyle!=null && el.currentStyle.hasLayout!=null && el.currentStyle.hasLayout==false)
    el.style.display="inline-block";
}

function SameHeight(selector,maxh){
var i,v=selector.split(","),t,j,els=[],gap;
for(i=0;i<v.length;i++){
    t=getElementsBySelector(v[i]);
    els=els.concat(t);
    }
for(i=0;i<els.length;i++){
    if(els[i].offsetHeight>maxh) maxh=els[i].offsetHeight;
    els[i].style.height="auto";
    }
for(i=0;i<els.length;i++){
    gap=maxh-els[i].offsetHeight;
    if(gap>0){
        t=CreateEl("b");t.className="niftyfill";t.style.height=gap+"px";
        nc=els[i].lastChild;
        if(nc.className=="niftycorners")
            els[i].insertBefore(t,nc);
        else els[i].appendChild(t);
        }
    }
}

function getElementsBySelector(selector){
var i,j,selid="",selclass="",tag=selector,tag2="",v2,k,f,a,s=[],objlist=[],c;
if(selector.find("#")){ //id selector like "tag#id"
    if(selector.find(" ")){  //descendant selector like "tag#id tag"
        s=selector.split(" ");
        var fs=s[0].split("#");
        if(fs.length==1) return(objlist);
        f=document.getElementById(fs[1]);
        if(f){
            v=f.getElementsByTagName(s[1]);
            for(i=0;i<v.length;i++) objlist.push(v[i]);
            }
        return(objlist);
        }
    else{
        s=selector.split("#");
        tag=s[0];
        selid=s[1];
        if(selid!=""){
            f=document.getElementById(selid);
            if(f) objlist.push(f);
            return(objlist);
            }
        }
    }
if(selector.find(".")){      //class selector like "tag.class"
    s=selector.split(".");
    tag=s[0];
    selclass=s[1];
    if(selclass.find(" ")){   //descendant selector like tag1.classname tag2
        s=selclass.split(" ");
        selclass=s[0];
        tag2=s[1];
        }
    }
var v=document.getElementsByTagName(tag);  // tag selector like "tag"
if(selclass==""){
    for(i=0;i<v.length;i++) objlist.push(v[i]);
    return(objlist);
    }
for(i=0;i<v.length;i++){
    c=v[i].className.split(" ");
    for(j=0;j<c.length;j++){
        if(c[j]==selclass){
            if(tag2=="") objlist.push(v[i]);
            else{
                v2=v[i].getElementsByTagName(tag2);
                for(k=0;k<v2.length;k++) objlist.push(v2[k]);
                }
            }
        }
    }
return(objlist);
}

function getParentBk(x){
var el=x.parentNode,c;
while(el.tagName.toUpperCase()!="HTML" && (c=getBk(el))=="transparent")
    el=el.parentNode;
if(c=="transparent") c="#FFFFFF";
return(c);
}

function getBk(x){
var c=getStyleProp(x,"backgroundColor");
if(c==null || c=="transparent" || c.find("rgba(0, 0, 0, 0)"))
    return("transparent");
if(c.find("rgb")) c=rgb2hex(c);
return(c);
}

function getPadding(x,side){
var p=getStyleProp(x,"padding"+side);
if(p==null || !p.find("px")) return(0);
return(parseInt(p));
}

function getStyleProp(x,prop){
if(x.currentStyle)
    return(x.currentStyle[prop]);
if(document.defaultView.getComputedStyle)
    return(document.defaultView.getComputedStyle(x,'')[prop]);
return(null);
}

function rgb2hex(value){
var hex="",v,h,i;
var regexp=/([0-9]+)[, ]+([0-9]+)[, ]+([0-9]+)/;
var h=regexp.exec(value);
for(i=1;i<4;i++){
    v=parseInt(h[i]).toString(16);
    if(v.length==1) hex+="0"+v;
    else hex+=v;
    }
return("#"+hex);
}

function Mix(c1,c2){
var i,step1,step2,x,y,r=new Array(3);
if(c1.length==4)step1=1;
else step1=2;
if(c2.length==4) step2=1;
else step2=2;
for(i=0;i<3;i++){
    x=parseInt(c1.substr(1+step1*i,step1),16);
    if(step1==1) x=16*x+x;
    y=parseInt(c2.substr(1+step2*i,step2),16);
    if(step2==1) y=16*y+y;
    r[i]=Math.floor((x*50+y*50)/100);
    r[i]=r[i].toString(16);
    if(r[i].length==1) r[i]="0"+r[i];
    }
return("#"+r[0]+r[1]+r[2]);
}


/* END NiftyCorners*/





/** 
 * setup hint toggling for input elements
 * the input element needs a hint attribute: hint="my hint" 
 * this will be shown whenever the input is empty
 * Example setup: 
 * 
 * $(document).ready(function() {setupToggleHint('input.toggleHint');});
 * 
 * if the hint is active, the element has a placeholder class, 
 * so you can easily use this for styling in your css.
 * Example: hints appear gray:
 * 
 * .placeholder {color:#999}
 * 
 */
function setupToggleHint( selector) {
	$(selector).each(
			function(){

				var $input=$(this);

				// lost focus
				$input.bind('blur',function(){
					if($input.attr('value').length==0){
						$input.attr('value',$input.attr('hint')).addClass('placeholder');
					}
					
					// gain focus
				}).bind('focus',function(){   
					if($input.hasClass('placeholder')){
						$input.attr('value','').removeClass('placeholder');
					}
					
					// add submit callback to form
				}).parents('form').bind('submit',function(){	
					$input.trigger('focus');
				});

				// trigger placeholder toggle if there is no value set
				if($input.attr('value')==''){
					$input.trigger('blur');
				}
			}
	);
}


/* */