/*
	jquery.ideagento.forms 1.2 - 16.11.2010
	(C) Ideagento CMS Systeme - Ulrich Frühauf
*/

// Konstanten
	var STR_PAD_RIGHT=0, STR_PAD_LEFT=1, STR_PAD_BOTH=2;


// Integration notwendig	
	function fnStoreChanges () {
		window.alert ('store Changes nicht implementiert');
	}
	

	jQuery.fn.alternateRowColors = function () {
		var count=0;
		$('tbody tr').each (function () {
			if ($(this).css('display')!='none') {
				count++;
				if (count%2==0) {
					$(this).removeClass ('even').addClass ('odd');
				} else {
					$(this).removeClass ('odd').addClass ('even');
				}
			}
		});
		return (this);
	}
	
	jQuery.fn.addNumOptions = function (map) {
	
		if (typeof (map['step'])=='undefined') map['step']=1;
		if (typeof (map['padding'])=='undefined') map['padding']=false;
	
		for (var dummy=map['from']; dummy<=map['to']; dummy+=map['step']) {
			this.append ('<OPTION value="'+dummy+'">'+dummy.toString ().strpad (map['to'].toString ().length, '0', map['padding']) +'</OPTION>');
		}
	}
	
	jQuery.fn.addOptions = function (map) {
		if (typeof (map['value_key'])=='undefined') {
			for (var dummy=0; dummy<map['options'].length; dummy++) this.append ('<OPTION value="'+map['options'][dummy][0]+'">'+map['options'][dummy][1]+'</OPTION>');
		} else {
			for (var dummy=0; dummy<map['options'].length; dummy++) this.append ('<OPTION value="'+map['options'][dummy][map['value_key']]+'">'+map['options'][dummy][map['text_key']]+'</OPTION>');
		}
	}
	
	jQuery.fn.countCols = function () {
		var numCols=0;
		$('tr', this).each (function () {
			var numThisCols=0;
			$row=$(this);
			$('td', $row).each (function () {
				numThisCols+=$(this).attr ('colspan')?parseInt ($(this).attr ('colspan')):1;
			});
			if (numThisCols>numCols) numCols=numThisCols;
		});
		return (numCols);
	}
	
	jQuery.fn.clear = function () {
		for (var dummy=0; dummy<this[0].elements.length; dummy++) {
			switch (this[0].elements[dummy].type) {
				case 'file'	: 		this[0].elements[dummy].value='';
									break;
				case 'text'	: 		this[0].elements[dummy].value='';
									break;
				case 'textarea' :	this[0].elements[dummy].innerHTML='';
									break;
			}
		}
		
		$('.xinha_textarea', $(this)).each (function () {
			xinha_editors[$(this).attr ('id')].setEditorContent (''); 
		});				
	}
	
	$(document).ready (function () {
		$(document).ready (function () {
			$('.xinha_textarea').each (function () {
				if (xinha_editors==null) xinha_editors=[];
				this.id=$(this).attr ('name');
				xinha_editors.push ($(this).attr ('name'));
			});		
		});
		if (typeof(xinha_editors)=='object'&&(xinha_editors instanceof Array) && xinha_editors.length) xinha_init ();
	});
	
	$(document).ready (function () {
		// filtert Tabellenzeilen anhand des Vergleichs eines Input-Fields mit einer Spalte
		$('.filterInput').each (function () {						
			var index=$(this).index ();			
			var $parent=$(this).closest ('tr').parent ();
			if ($parent[0].tagName=='THEAD') $parent=$parent.nextAll ('tbody');
			var inputValue=($(this).html ())?$(this).html ():'';
			$(this).html ('');
			
			var $input=$('<INPUT type="text" value="'+inputValue+'" class="inputLabel">');			
			$input
				.appendTo ($(this))
				.keyup (function () {
					$('tr', $parent).each (function () {
						$(this).css ('display', $('td:nth-child('+(index+1)+')', $(this)).html ().search ($input.val ())!=-1?'table-row':'none');
					});
					$input.closest ('table').alternateRowColors ();						
				})
				.click (function () {
					$(this)
						.removeClass ('inputLabel')
						.val ('')
						.unbind ('click')
				})
			;							
		});		
	});
	
	$(document).ready (function () {
		// filtert Tabellenzeilen anhand des Vergleichs eines Select mit einer Spalte
		$('.filterSelect').each (function () {						
			var index=$(this).index ();			
			var $parent=$(this).closest ('tr').parent ();
			if ($parent[0].tagName=='THEAD') $parent=$parent.nextAll ('tbody');
								
			var $select=$('<SELECT><OPTION value="alle">alle</OPTION></SELECT>');
			var rowValues=[];
			$('tr', $parent).each (function () {
				rowValues.push ($('td:nth-child('+(index+1)+')', $(this)).text ());
			});
			rowValues.sort ();
			for (var dummy=1; dummy<rowValues.length; dummy++) {
				if (rowValues[dummy]==rowValues[dummy-1]) {
					rowValues.splice (dummy,1);
					dummy--;
				}
			}
			for (var dummy=0; dummy<rowValues.length; dummy++) $select.append ('<OPTION value="'+rowValues[dummy]+'">'+rowValues[dummy]+'</OPTION>');
			$select
				.appendTo ($(this))
				.change (function () {
					if ($select.val ()=='alle') {
						$('tr', $parent).css ('display', 'table-row');
					} else {
						$('tr', $parent).each (function () {
							$(this).css ('display', $('td:nth-child('+(index+1)+')', $(this)).text ().search ($select.val ())!=-1?'table-row':'none');
						});
					}
					$select.closest ('table').alternateRowColors ();	
					$('table.paginated').each (function () {
						$(this).fnRepaginate ();
					});					
					
				});
			;							
		});		
	});
	
	
	$(document).ready (function () {
		$('table.sortable').each (function () {
			var $table=$(this);
			$table.alternateRowColors ();
			$('th', $table).each (function (column) {
				var $header=$(this);
				var findSortKey;
				if ($header.is ('.sort-alpha')) {
					findSortKey=function ($cell) {
						return $cell.find ('.sort-key').text ().toUpperCase ()+' '+$cell.text ().toUpperCase ();
					};
				} else if ($header.is ('.sort-numeric')) {
					findSortKey=function ($cell) {
						var key=$cell.text ().replace (/^[^\d.]*/, '');
						key=parseFloat (key);
						return isNaN (key)?0:key;
					};
				} else if ($header.is ('.sort-date')) {
					findSortKey = function ($cell) {
						return Date.parse ('1 '+$cell.text ());
					};
				} else if ($header.is ('.sort-key')) {
					findSortKey = function ($cell) {
						return $cell.attr ('sortKey');
					};
				}
				if (findSortKey) {
					$header.prepend ('<DIV class="ui-icon"></DIV>')
					$header	.addClass ('clickable')	
							.hover (function () { $header.addClass ('hover'); }, function () { $header.removeClass ('hover'); })
							.click (function () {
								var sortDirection=$header.is ('.sorted-asc')?-1:1;
								var rows=$table.find ('tbody > tr').get ();
								$.each (rows, function (index, row) {
									var $cell=$(row).children ('td').eq (column);
									row.sortKey=findSortKey ($cell);
								});
								rows.sort (function (a,b) {
									if (a.sortKey<b.sortKey) return -sortDirection;
									if (a.sortKey>b.sortKey) return sortDirection;
									return 0;
								});
								$.each (rows, function (index, row) {
									$table.children ('tbody').append (row);
									row.sortKey=null;
								});
								$table.find ('th')	.removeClass ('sorted-asc')
													.removeClass ('sorted-desc');
								if (sortDirection==1) $header.addClass ('sorted-asc'); else $header.addClass ('sorted-desc');
								$table.find ('td')	.removeClass ('sorted')
													.filter (':nth-child('+(column+1)+')')
													.addClass ('sorted');
								$table.alternateRowColors ();
								$table.trigger ('repaginate');
							});
				}
				
			});
		});
	});
	
	$(document).ready (function () {
		$('table.paginated').each (function () {
			$(this).fnRepaginate ();
		});
	});
	
	jQuery.fn.fnRepaginate = function () {
			var $table=$(this);
			var currentPage=0;
			$('.pager', $table).remove ();
			var numPerPage=$table.attr ('entries')?$table.attr ('entries'):10;
			$table.bind ('repaginate', function () {
				$table.find ('tbody tr')	.hide ()
											.slice (currentPage*numPerPage, (currentPage+1)*numPerPage)
											.show ();					
			});
			var numRows=$table.find ('tbody tr').length;
			var numPages=Math.ceil (numRows/numPerPage);
			var $pager=$('<DIV class="pager"></DIV>');
			var $numPerPage=$('<NOBR class="numPerPage">Einträge/Seite: <SELECT><OPTION value="10">10</OPTION><OPTION value="20">20</OPTION><OPTION value="50">50</OPTION></SELECT></NOBR>');
			$('option[value='+numPerPage+']', $numPerPage).attr ('selected', 'selected');
			$numPerPage	.appendTo ($pager)
						.bind ('change', function () {
							$table.attr ('entries', $('select', $numPerPage).val ());
							$table.fnRepaginate ();
						});
			
			for (var page=0; page<numPages; page++) {
				if (page==(numPages-1)) $('<SPAN class="page-number ppp-stop">...</SPAN>').appendTo ($pager);
				$('<SPAN class="page-number page'+(page+1)+'"></SPAN>')	.text (page+1)
														.bind ('click', {newPage: page},function (event) {
															currentPage=event.data['newPage'];
															
															$('.page-number', $table).css ('display', 'none');
															var start=Math.max (1, currentPage-2);
															var stop=Math.min (currentPage+3, numPages);
															$('.page1', $table).css ('display', 'inline');
															if ((currentPage-3)>0) $('.ppp-start', $table).css ('display', 'inline');
															for (var dummy=start; dummy<stop; dummy++) {
																$('.page'+(dummy+1), $table).css ('display', 'inline');
															}
															if ((currentPage+4)<numPages) $('.ppp-stop', $table).css ('display', 'inline');
															$('.page'+numPages, $table).css ('display', 'inline');
															

															$table.trigger ('repaginate');
															$(this)	.addClass ('active')
																	.siblings ().removeClass ('active');																
														})
														.appendTo ($pager)
														.addClass ('clickable');
				if (page==0) $('<SPAN class="page-number ppp-start">...</SPAN>').appendTo ($pager);
			}
			
			$pager	.prependTo ($table.find ('tfoot tr th:first-child'))
					.find ('span.page-number:first').addClass ('active');
			$('.page1', $table).trigger ('click');
	}
		
	$(document).ready (function () {
		$('table.select, tbody.select').each (function () {
			$table=$(this);
			$('tr', $table)	.addClass ('clickable')
									.bind ('click', function () {
										$(this).closest ('form').trigger ('change');
									});
			// $('tfoot td:first-child', $table).attr ('colspan', $('thead tr:first-child', $table).children ().length);			
		});
	});
		
	$(document).ready (function () {
		$('table.select_one').each (function () {
			$table=$(this);
			$('tbody tr', $table)	.bind ('click', function () {
										$('input[name=selectedID]', $table).val ($(this).attr ('selectedID'));
										$('form', $table).submit ();
									});			
		});
	});

	var selectionStates=['selected0', 'selected1', 'selected2', 'selected3'];
	$(document).ready (function () {
		$('table.select_multi, tbody.select_multi').each (function () {
			$table=$(this);
			if ($table.hasClass ('multi_state')) {
				var anzStates=$table.attr ('states');
				
				$('tr', $table)	.attr ('selectionState', 0)
								.bind ('click', function () {
									var selectionState=$(this).attr ('selectionState');
									$(this).removeClass (selectionStates[selectionState]);
									selectionState++;
									selectionState=selectionState%anzStates;
									$(this).attr ('selectionState', selectionState);
									$(this).addClass (selectionStates[selectionState]);

									var selectedIDs='[';
									$('tr', $table).each (function () {
										var selectionState=$(this).attr ('selectionState');
										if ($(this).attr ('selectedID') && selectionState>0) selectedIDs+=selectedIDs=='['?'['+$(this).attr ('selectedID')+', '+selectionState+']':', ['+$(this).attr ('selectedID')+', '+selectionState+']';
									});
									selectedIDs+=']';
									$('input[name=selectedIDs]', $table).val (selectedIDs);
								});
			
			} else {
				$('tr', $table)	.bind ('click', function () {
					$(this).toggleClass ('selected')
					var selectedIDs='[';
					$('tr.selected', $table).each (function () {
						selectedIDs+=selectedIDs=='['?$(this).attr ('selectedID'):','+$(this).attr ('selectedID');;
					});
					selectedIDs+=']';
					$('input[name=selectedID]', $table).val (selectedIDs);
									
				});			
			}
		});
	});

	$(document).ready (function () {
		$('table.highlight_row, tbody.highlight_row').each (function () {
			$table=$(this);
			$('tr', $table)	.hover (function () { $(this).addClass ('hover')}, function () { $(this).removeClass ('hover')})
		});
			
	});
	
	$(document).ready (function () {
		$('table.expandable').each (function () {
			$table=$(this);
			$icon=$('<DIV class="ui-icon ui-icon-triangle-1-e" style="float: left;"></DIV>');
			$icon.addClass ('clickable');
			$icon.bind ('click', {table: $table}, function (event) {
				$(this).toggleClass ('ui-icon-triangle-1-e').toggleClass ('ui-icon-triangle-1-s');
				$('tfoot', event.data.table).toggleClass ('visible');
				$('tbody', event.data.table).toggleClass ('visible');
			});
			
			$('thead tr:first-child th', $table).prepend ($icon);
		});

		$('tbody.expandable').each (function () {
			$tbody=$(this);
			$tbody.children ('tr:gt(0)').addClass ('no-display');
			$icon=$('<DIV class="ui-icon ui-icon-triangle-1-e" style="float: left;"></DIV>');
			$icon	.addClass ('clickable')
					.bind ('click', function () {
						$(this).toggleClass ('ui-icon-triangle-1-e').toggleClass ('ui-icon-triangle-1-s');
						$tbody.children ('tr:gt(0)').each (function () {
							$(this).toggleClass ('no-display');
							$('.xinha_textarea', $(this)).each (function () {
								xinha_editors[$(this).attr ('id')].activateEditor (); 
								xinha_editors[$(this).attr ('id')].sizeEditor ();
							});
							
						});
					})
					.prependTo ($('tr:first-child th', $tbody));			
		});
		
	});
	
	$(document).ready (function () {
		$('form.check').each (function () {
			$form=$(this);
			$form.bind ('submit', function () {
				$('.checkText', $form).each (function () {
					$field=$(this);
					if ($field.hasClass ('required')) {
						if ($field.is ('input[type=checkbox]')) {
							($field.attr ('checked')==false)?($field.parent ().addClass ('checkError')):($field.parent ().removeClass ('checkError'));
						}
						if ($field.is ('input[type=text]')) $field.val ().length==0?$field.addClass ('checkError'):$field.removeClass ('checkError');
					}
				});
				$('.checkEmail', $form).each (function () {
					$field=$(this);
					if (($field.hasClass ('required') || $field.val ().length>0)) {						
						var filter=/^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i
						filter.test($field.val ())?$field.removeClass ('checkError'):$field.addClass ('checkError');
					} else {
						$field.removeClass ('checkError');
					}
				});
				$('.checkUrl', $form).each (function () {
					$field=$(this);
					if (($field.hasClass ('required') || $field.val ().length>0)) {						
						var filter=/^http:\/\/(www\.)?([a-zA-Z0-9]{3,65})(\.[a-zA-Z]{2,4})$/i
						filter.test($field.val ())?$field.removeClass ('checkError'):$field.addClass ('checkError');
					} else {
						$field.removeClass ('checkError');
					}
				});
				$('.checkRegExp', $form).each (function () {
					$field=$(this);
					if (($field.hasClass ('required') || $field.val ().length>0)) {						
						regExpression=new RegExp ($field.attr ('regExp'));
						regExpression.test ($field.val ())?$field.removeClass ('checkError'):$field.addClass ('checkError');
					}
					
				});
				if ($('.checkError', $form).length>0) {
					if (!$('.checkErrorMessage', $form).length) $('tfoot', $form).prepend ('<TR><TD colspan="'+$form.countCols ()+'" class="checkErrorMessage">Fehler: Sie haben nicht alle Felder richtig ausgef&uuml;llt</TD></TR>');
					return false;
				}
			});
		});
	});

	jQuery.fn.ajaxUpload = function (map) {
		if (map=='destroy') {
			$(this).unbind ('submit');
			return true;
		}
		
	
		var $dialog;
		var callback=function (data) {
			$dialog.dialog ('destroy');
			$('#uploadMessage').remove ();
					// $('button.save-changes').button ({ disabled: true })

			if (typeof (map.callback)=='function') {
				eval ('var retValue='+data);
				if (typeof (map.data)=='object') {
					$.extend (true, retValue, map.data);
				}
				map.callback (retValue);
			} else {
				if (typeof (console)!='undefined') console.debug (data);
			}		
		}
		var testBefore=function (form) {
			if (typeof (map.testBefore)=='function') {
				return map.testBefore (form);
			} else {
				return true;
			}
		}
		
		$(this).bind ('submit', function () {
		
			if (!testBefore (this)) return false;
			$('button.save-changes', $(this))	.removeClass ('ui-state-hover ui-state-focus')
												.button ({ disabled: true })
			
		
			$dialog=$('<DIV id="uploadMessage" title="Daten-Transfer"><DIV id="uploadMessageInfoText">Bitte haben Sie einen Moment Geduld. Die Daten werden zum Server übertragen.</DIV><DIV id="uploadMessageProgressBar"></DIV><DIV id="uploadMessageFileName"></DIV></DIV>');
			$dialog.appendTo ($('body'));
			$('#uploadMessageProgressBar', $dialog).progressbar ({ value: 0 });
			$dialog.dialog ({
				modal: true,
				width: 600,
				height: 200
			});
			var xhr=new XMLHttpRequest ();
			xhr.upload.onprogress=function (e) {
				var loaded=Math.round(100*e.loaded/e.total);
				$('#uploadMessageProgressBar').progressbar ('value', loaded);
			};
			
			var boundary = '------multipartformboundary' + (new Date).getTime();
			var dashdash = '--';
			var crlf     = '\r\n';

			/* Build RFC2388 string. */
			var builder = '';
			builder += dashdash;
			builder += boundary;
			builder += crlf;


			var formData=$(this).serializeArray ();
			$.each(formData, function (index, field){
			
				builder += 'Content-Disposition: form-data; name="'+field.name+'"';
				builder += crlf;
				builder += crlf;
				builder +=field.value;
				builder +=crlf;
				builder += dashdash;
				builder += boundary;
				builder += crlf;
						
			});
			
    
			/* For each dropped file. */
			$('input[type=file]', $(this)).each (function () {
				_rata=$(this);
				var files=this.files;
				for (var dummy=0; dummy<files.length; dummy++) {
					var file=files[dummy];
					$('#uploadMessageFileName').text (file.fileName);
					/* Generate headers. */            
					builder += 'Content-Disposition: form-data; name="'+$(this).attr ('name')+'[]"';
					if (file.fileName) {
						builder += '; filename="' + file.fileName + '"';
					}
					builder += crlf;

					builder += 'Content-Type: '+file.type;
					builder += crlf;
					builder += crlf; 
			
					/* Append binary data. */
					builder += file.getAsBinary();
					builder += crlf;

					/* Write boundary. */
					builder += dashdash;
					builder += boundary;
					builder += crlf;
				}
			});
    
			/* Mark end of the request. */
			builder += dashdash;
			builder += boundary;
			builder += dashdash;
			builder += crlf;

			xhr.open("POST", $(this).attr ('action'), true);
			xhr.onreadystatechange = function (e) {  
				if (xhr.readyState == 4) {
					callback (xhr.responseText);
				}
			}  
			xhr.setRequestHeader('content-type', 'multipart/form-data; boundary='+boundary);
			xhr.sendAsBinary(builder);    			
			
			return false;
		});
	}
	
	
	
	
	

String.prototype.strpad = function () {

  var retValue=new String(this);

  switch (arguments.length) {
    case 0:	return (retValue);
    		break;
    case 1: strPadChar=' ';
            intPadLength=arguments[0];
            strPadPosition=STR_PAD_RIGHT;

            break;
    case 2: strPadChar=arguments[1].substr (0,1);
            intPadLength=arguments[0];
            strPadPosition=STR_PAD_RIGHT;
            break;
    case 3: strPadChar=arguments[1].substr (0,1);
            intPadLength=arguments[0];
            strPadPosition=arguments[2];
            break;
  }

  switch (strPadPosition) {
    case 0: for (var dummy=this.length; dummy<intPadLength; dummy++) {
              retValue+=strPadChar;
            }
            break;
    case 1: for (var dummy=this.length; dummy<intPadLength; dummy++) {
              retValue=strPadChar+retValue;
            }
            break;
    case 2: for (var dummy=this.length; dummy<intPadLength; dummy+=2) {
              retValue+=strPadChar;
              if (retValue.length==intPadLength) break;
              retValue=strPadChar+retValue;
            }
            break;

  }

  return (retValue);
}

String.prototype.toUnicode = function () {
	var unicodeString = '';
	if (encodeURIComponent) unicodeString = encodeURIComponent(this);
		else unicodeString = escape(this);
	return unicodeString;
}
	
