/*
Dependencies:
- jquery
- jquery metadata
*/

var Roularta = (function(){});
var $R = Roularta;
var errors; // zie Roularta.addError en Roularta.showErrors

/*INIT ----------------------------------------------------------*/
Roularta.init = function(){ /*do nothing, override me*/ };

/*REFRESH -------------------------------------------------------*/
Roularta.refresh = function(){ /*do nothing, override me*/ };

/*BOOKMARK -------------------------------------------------------*/
Roularta.bookmark = function(){
	var url = document.location;
	var title = document.title;
	if ((typeof window.sidebar == "object") && (typeof window.sidebar.addPanel == "function")) 
	  window.sidebar.addPanel (title, url, "");
	else if (typeof window.external == "object") 
	  window.external.AddFavorite(url, title);
	else if (window.opera && document.createElement){
	  var a = document.createElement('A');
	  if (!a) return false; //IF Opera 6
	  a.setAttribute('rel','sidebar');
	  a.setAttribute('href',url);
	  a.setAttribute('title',title);
	  a.click();
	}	else 
	  return false;
 };

/*SHUFFLER ------------------------------------------------------*/
Roularta.shuffle = function(parentSelector, childSelector){
  var shuffle;
  if(parentSelector != null) {
    shuffle = jQuery(parentSelector);
  } else {
    shuffle = jQuery('.shuffle');
  }
  if( jQuery(shuffle).length > 0 ){ 
    jQuery(shuffle).each( function() { jQuery(this).shuffle(parentSelector, childSelector); } ); 
  }
};

jQuery.fn.shuffle = function(parentSelector , childSelector){
  if(parentSelector == null || childSelector == null){
    var children = jQuery(this).children(childSelector);
  } else {
    var children = jQuery(parentSelector+' '+childSelector);
  }
  var childrenHTML = new Array();
  jQuery(children).each( function(index) {
    childrenHTML[index] = jQuery(this).html();
  });

  var random = new RandomIterator( childrenHTML );
  jQuery(children).each( function() {
    jQuery(this).html( random.next() );
  });
};

/*RANDOM ----------------------------------------------------*/
Roularta.showRandom = function(){
  var rotate = jQuery('.random');
  if( jQuery(rotate).length > 0 ){ 
    jQuery(rotate).each( function() { jQuery(this).showRandom(); } ); 
  }
};

jQuery.fn.showRandom= function(){
  var children = jQuery(this).children();
  var random = new RandomIterator( children );
  if( random.hasNext() ){
    jQuery(random.next()).show();
  }
  while( random.hasNext() ){
    jQuery(random.next()).hide();
  }
};

/* REQ PARAM ------------------------------*/
Roularta.getParamFromQueryString = function(param) {
    if(!Roularta.queryStringParameters){
	Roularta.queryStringParameters = {};
	var params = location.search.replace(/^\?/,'').split('&');
	    for( var i = params.length-1;  i >= 0;  i-- ) {
	        var p = params[i].split('='), key = p[0];
		if( key ){
		    if(key == 'params'){
			var paramparams = '';
			if(p[1].indexOf(';') == -1){
		    	    paramparams = p[1].split('%3B');
			} else {
			    paramparams = p[1].split(';');
			}					
			for (var j = paramparams.length-1; j>=0; j--){
			    var q = '';
			    var qkey = '';
			if(paramparams[j].indexOf(':') == -1){
			    q = paramparams[j].split('%3A'), qkey = q[0];
			} else {
			    q = paramparams[j].split(':'), qkey = q[0];
			}
			if(qkey){
			    Roularta.queryStringParameters[qkey] = unescape(q[1]);
			}
	            } 
		}else {
		    Roularta.queryStringParameters[key] = unescape(p[1]);
		}
	    }
	}
    }
    return Roularta.queryStringParameters[param];
}
/*ESCAPE FORM  ---------------------------------------------*/
Roularta.escapeForm = function(form){
	var location = jQuery(form).attr('action');
	if(location.indexOf('?')>0){
		location+='&';
	}else{
		location+='?';
	}
	jQuery(form).find('input').each(function(){
		var name = jQuery(this).attr('name');
		var value = jQuery(this).val();
		var type = jQuery(this).attr('type');
		if(value.length>0){
			if(type == 'text' || type == 'hidden'){
				location += name+'='+Roularta.urlEncode(value)+'&';
			} else if(type == 'checkbox'){
				if(jQuery(this).attr('checked')||jQuery(this).attr('checked')=='true'||jQuery(this).attr('checked')=='checked'){
					location += name+'='+Roularta.urlEncode(value)+'&';
				}
			}
		}
	});
	$(form).find('select').each(function(){
		var name = jQuery(this).attr('name');
		var value = jQuery(this).val();
		if(value.length>0){
			location += name+'='+Roularta.urlEncode(value)+'&';
		}
	});
	return location
}

Roularta.urlEncode = function(s){
	var value = escape(s);
	value = value.replace(/\+/g,'%2B');
	return value;
};

/*AUTOCOMPLETE  ---------------------------------------------*/
Roularta.autoComplete = function(selector,list, onError, onSuccess){
	var thisList = list;
	jQuery(selector).each(function(){
		new actb(this,thisList);
                var thisForm = jQuery(this).parents('form').get(0);
                var thisInput = this;
                jQuery(thisForm).submit(function(){
                  var value = jQuery(thisInput).val();
                  var found = false;
                  for(var i=0;i<thisList.length && !found;i++){
                    if(thisList[i] == value){
                       found = true;
                    }
                  }
                  if(!found){
                    if(onError != null){
                      return onError.apply(thisInput);
                    } else {
                      return false;
                    }
                  } else {
                    if(onSuccess != null){
                      return onSuccess.apply(thisInput);
                    } else {
                      return true;
                    }
                  }
                });
	});	
};


/* Popup  -----------------------------------------------------
voeg onclick event toe aan externe links

vb:
<a href="http://www.google.com/" class="popup {windowName: 'myWindow', windowFeatures: {location:1,status:1,scrollbars:1,
  width:100,height:100}}">click hier</a>
  
 gebruik # ipv , voor bug in IE te omzeilen
*/
Roularta.popup = function(selector){
  if(selector == null){
    selector = "a.popup";
  }
  jQuery(selector).each(function() {
    jQuery(this).click(function() {
	  popupMetadata = jQuery(this).metadata();
	  windowFeatures = ""; 
	  for(key in popupMetadata.windowFeatures) {
		if(windowFeatures.length){
			windowFeatures = windowFeatures + ",";
		}
	    windowFeatures = windowFeatures + key + "=" + popupMetadata.windowFeatures[key];
	  }
      window.open(jQuery(this).attr("href"),popupMetadata.windowName,windowFeatures);
      return false;
    });
  });
}

/* Messagent  -----------------------------------------------------
voegt URL en URL description aan de link toe, zodat deze kunnen ingeladen worden voor messagent

vb:
<a href="XXX" class="messagent">YYY</a>
*/
Roularta.messagent = function(selector){
  if(selector == null){
    selector = "a.messagent";
  }
  jQuery(selector).each(function() {
		jQuery(this).click(function(){
			href = jQuery(this).attr("href");
			if(href.indexOf("?")>0){
				href = href+ "&";
			}else{
				href = href+ "?";
			}
			href = href + "params=URL:"+ escape(window.location) + ";URLDESCRIPTION:" + escape(document.title);
			window.location = href;
			return false;
		});
	});
}

/* Error  -----------------------------------------------------
houdt foutboodschappen bij in een array en toont ze nadien naar de gebruiker toe
*/
Roularta.addError = function(message) {
   if (errors == null) {
      errors = new Array();
   } 
   errors.push(message);
};

Roularta.showErrors = function() {
   if (errors != null && errors.length > 0) {
	   var totalMessage = "";
	   for (var message in errors) {
	       totalMessage = ( totalMessage + errors[message] + '\n' );
	   }
	   jQuery("#errorMessage").text(totalMessage);
	   jQuery("#errorMessage").fadeIn("slow");
   }
};

/*Random Iterator -------------------------------------------*/
function RandomIterator(array){
 this.array = array;
 this.picked = new Array();

 this.hasNext = function hasNext(){
   return this.picked.length < this.array.length;
 }

 this.next = function next(){
   if(!this.hasNext()){
     return null;
   } else {
     return array[this.random()];
   }
 }
 
 this.random = function random(){
   var randomNumber = Math.floor(Math.random()* this.array.length);
   var alreadyPicked = false;
   for(var i = 0; i<this.picked.length && !alreadyPicked; i++){
    if(randomNumber == this.picked[i]){
      alreadyPicked = true;
    }
   }
   if(alreadyPicked){
     return this.random();
   } else {
     this.picked[i] = randomNumber ;
     return randomNumber ;
   }
 }
}

/* Map -----------------------------------------------------*/
function Map(){
    var me = this;
    me.keys = new Array();
    me.values = new Array();
    
    this.put = function put(key, value){
      var index = me.indexOf(key);
      if(index == -1){
          me.keys.push(key)
          me.values.push(value);
      } else {
          me.values[index]=value;
      }
    }

  this.get = function get(key){
    var index = me.indexOf(key);
    if(index == -1){
        return null;
    } else {
        return me.values[index];
    }
  } 
	
    this.getKey = function getKey(value){
      var index = me.indexInArrayOf(me.values,value);
      if(index == -1){
          return null;
      } else {
          return me.keys[index];
      }
    }
	
    this.keySet = function keySet(){
      return me.keys;
    }

    this.remove = function remove(key){
      var index = me.indexOf(key);
      if(index != -1){
          me.keys[index]=null;
          me.values[index]=null;
      }
    }

    this.contains = function contains(key){
      var index = me.indexOf(key);
      return (index != -1);
    }

    this.size = function size(){
      return me.keys.length;
    }
	
	this.indexOf = function indexOf(key){
		return me.indexInArrayOf(me.keys,key);
	}
	
    this.indexInArrayOf = function indexInArrayOf(anArray,key){
       var index = -1;
       for(var i = 0; (i<anArray.length && index == -1); i++){
          if(key == anArray[i]){
            index = i;
          }
       }
       return index;
    }
}



/* Poll  -----------------------------------------------------
Functie die wordt gebruikt bij poll antwoord afhandeling. De methode vraag een parameter (frm) die
een verwijzing is naar het form element.
Indien er een element checked staat wordt de form gesubmit. Indien niet wordt er een waarschuwing weergegeven.
*/

function controleerInputPoll(frm, error) {
	var aangeklikt = false;
	for (var i = 0; i < frm.elements.length; i++) {
		if (frm.elements[i].checked) {
			aangeklikt = true;
		}
	}

	if (aangeklikt) {
		frm.submit();
	} else {
		alert(error);
	}
}

function url(input){
    return input;
}
