text:
Understanding Noah's Classifieds/Multiple Image Extension

Problem
In Noah's classifieds an advert can only submit one image, we want to submit n images.

First you will need this new file, save it is image.php in your root folder of Noah. Image.php Source

Target Functionality
Now let's first talk about our target. We want the following features:
 * Obviously all created data must be deleted upon the removal of the advert
 * Use HTML Text as a spacer between images
 * Dynamically create the upload fields so submission is not cluttered
 * Remove a single image without deleting the ad
 * Allow for dynamic setting of maxImageCount, maxImageSize, maxImageThumb and whether single delete function is available

Here is a snapshot of the end result

Modifying gorum/dbproperty.php
Because any and all object_vars are automatically saved to the database it is problematic to use $this->data to pass data from one function to the next. To get around this the following modification needs to be made to dbproperty.php

function getCreateSetStr($base, $typ, $create=TRUE) {    $object_vars = get_object_vars($base); $firstField = TRUE; $query = ""; $typ = $base->getTypeInfo; foreach( $object_vars as $attribute=>$value ) { 		// NEW DAWID if (!isset($typ["attributes"][$attribute])) continue; // NEW DAWID

Modifying gorum/object.php
Change the function getVisibility as shown

function getVisibility( $typ, $attr ) {    global $gorumroll; if (!isset($typ["attributes"][$attr])) return Form_hidden;

Adding New Database Fields
Firstly we need to add 7 new rows to our category database (Table:classifieds_classifiedscategory)

imagesAllowed, Type int(4), default = 10, Unsigned ThumbSizeX, Type int(10), default = 64, Unsigned ThumbSizeY, Type int(10), default = 100, Unsigned imageMaxSizeX, Type int(12), default = 800, Unsigned imageMaxSizeY, Type int(12), default = 600, Unsigned imageSpacer, Type varchar(250), default = 'HTML TEXT' imageRemove, Type int(2), default = '1'

These are the new rows that I added. From the information you can see that imagesAllowed will have a range of 0-16, thumbSize 0-1024 and imageSize 0-2048. If these are too little or too much adjust accordingly so that it doesn't hog database space.

Here is the SQL Script for adding these

ALTER TABLE `classifieds_classifiedscategory` ADD `imagesAllowed` INT( 4 ) UNSIGNED NOT NULL DEFAULT '10', ADD `thumbSizeX` INT( 10 ) UNSIGNED NOT NULL DEFAULT '64', ADD `thumbSizeY` INT( 10 ) UNSIGNED NOT NULL DEFAULT '100', ADD `imageMaxSizeX` INT( 12 ) UNSIGNED NOT NULL DEFAULT '800', ADD `imageMaxSizeY` INT( 12 ) UNSIGNED NOT NULL DEFAULT '600', ADD `imageSpacer` VARCHAR( 250 ) NOT NULL DEFAULT ' ', ADD `imageRemove` INT( 2 ) DEFAULT '1' NOT NULL ;

Modifying Category.php
Add these to the top of the file just below this one shown. These tell Noah that we have added new fields to the database

/* DAWID JOUBERT IMAGE MODIFICATIONS ADDITIONS */ $category_typ["attributes"]["imagesAllowed"] = array(                "type"=>"INT",                 "text",                 "max" =>"16", 				"default"=>"10"				              ); $category_typ["attributes"]["thumbSizeX"] = array(                "type"=>"INT",                 "text",                 "max" =>"1024", 				"default"=>"128"				              ); $category_typ["attributes"]["thumbSizeY"] = array(                "type"=>"INT",                 "text",                 "max" =>"1024", 				"default"=>"128"				              ); $category_typ["attributes"]["imageMaxSizeX"] = array(                "type"=>"INT",                 "text",                 "max" =>"2048", 				"default"=>"800"              ); $category_typ["attributes"]["imageMaxSizeY"] = array(                "type"=>"INT",                 "text",                 "max" =>"2048", 				"default"=>"600"              ); $category_typ["attributes"]["imageSpacer"] = array(                "type"=>"VARCHAR",                 "text",                 "max" =>"250", 				"default"=>'
'              ); $category_typ["attributes"]["imageRemove"] = array(                "type"=>"INT",                 "bool",                 "default"=>"1"             ); /* DAWID JOUBERT IMAGE MODIFICATIONS ADDITIONS */

Modify lang_en.php as to stay consistent with language scheme
Now we also need to add the following to lang_en.php (and all the other languages you plan on using). For consistency add it after the comment that says "Category"

// Dawid Joubert Image Editing $lll["imagesAllowed"]="Number of Images Allowed"; $lll["thumbSizeX"]="Generated Thumbnails' size X"; $lll["thumbSizeY"]="Generated Thumbnails' size Y"; $lll["imageMaxSizeX"]="Max Image Size X"; $lll["imageMaxSizeY"]="Max Image Size Y"; $lll["imageSpacer"]="HTML Text to place after each image (use as spacer)"; $lll["pictureTemp"]='Pictures'; $lll["imageFileNotLoaded"]='Image file not saved/created!'; $lll["imageRemoveEnabled"] = 'Enable Image Remove Button '; $lll["removeImage"] = "Remove This Image"; $lll["missingImage"] = "Image does not exist, unable to remove it!"; $lll["detail_removeImage"] = "Image Removal"; $lll["imageRemove"] = "Image Remove Button Enabled?";

Consistency and Assumptions
Images are saved under "$adAttDir/$this->id".".".$ext and their thumbnails "$adAttDir/th_$this->id".".".$ext. This format is not a problem for storing single images but is for storing multiple images. So we will be modifying it.

First to maintain backward compatibility we will keep the current format for the first image in the sequence however the second, third and nth image will have this pattern.

Full Image:"$adAttDir/$this->id"."-$i.".$this->picture

Thumbnails:"$adAttDir/th_$this->id"."-$i.".$this->picture

Where $i is the image number starting from 0 so if a user had six jpeg images they will be named as follows:

pictures/listings/5.jpg		// First image. Shown in advert listing pictures/listings/5-0.jpg	// Second Image. Shown in details view (when viewing the advert) pictures/listings/5-1.jpg	//	"" pictures/listings/5-2.jpg	//	"" pictures/listings/5-3.jpg	//	"" pictures/listings/5-4.jpg	//	""

The function extensions will be saved into the picture row of the advertisement in a comma separated format "jpg,gif,jpg" we will then split this format into an array like this one array("jpg","gif","jpg").

So we will need to modify these functions and some others:
 * delete
 * This function is called when you remove the advertisement
 * showListVal
 * This function is called for every piece of information that is shown both in the advert listing and in the advert's details itself. We need this function so that it now lists all the pictures when viewing the advert details
 * activateVariableFields
 * This function needs to be modified so that it displays options for uploading n amount of images
 * storeAttatchment
 * Modify so that it actually stores all incoming images
 * showDetials
 * Shows the detailed view of the advertisement

delete in Advertisement.php
Replace everything inside

if ($this->picture) { .. Old Code .. };

With this so that the entire block looks like (Now any1 just dare tell me this doesn't look cleaner!!!)

if( $this->picture ) { 		$this->getImageExtensions; $limit = count($this->imageExtensions); for ($i=0;$i < $limit;$i++) { 			cleanDelete($this->getImageName($i)); cleanDelete($this->getThumbName($i)); } 	}

showListVal in advertisement.php
Replace everything in

elseif ($attr=="showpic") { ..old source code... }

With.

elseif ($attr=="showpic") { 	$s="";	// Will be overwritten later $this->getImageLimits; if($this->picture && $this->imagesAllowed)	// Do we have any extensions to work with? { 		// Create the image extensions for use $this->getImageExtensions; $this->Debug; // Are we in the details view? if ($gorumroll->method == "showdetails") { 			$limit = count($this->imageExtensions); $s = ''; for ($i=0;$i < $limit;$i++) { 				if (strlen($this->imageExtensions[$i]) > 2) {					 					$s .= $this->getImageHTML($i)."
"; } 			}			 		} 		else {	 			$tempRoll = $gorumroll; $tempRoll->list = $itemClassName; $tempRoll->method = "showdetails"; $tempRoll->rollid = $this->id; saveInFrom($tempRoll); // Just make the output equal to a single image $s= $this->getImageHTML($0,tempRoll->makeUrl,'_self'); } 	} }

hiding the original PICTURE element, advertisement.php
At the top of advertisement.php is $item_typ["attributes"]["picture"] = {..}; Add this to the array "form invisible", this will make sure that it is not added to the form when modifying/creating adds. The above-mentioned declaration will now look like this.

$item_typ["attributes"]["picture"] = array(                "type"='>'"VARCHAR",                 "text",                 "max" ='>'"250", 		"form hidden" // NEW LINE              ); // Fixed on 2007-01-16

ActivateVariableFields in advertisement.php
Modify the function as shown

// NEW CODE DAWID // Create new input boxes for each picture, but only if we are creating a new advert or modifying an existing one $this->Debug; if (($gorumroll->method == "modify_form") || ($gorumroll->method == "create_form")) { 		$this->getImageExtensions; $this->getImageLimits; $i = 0; $lll["picture0"]=$lll["pictureTemp"];	// Creates language thingies $showCount=0; $temp = ""; for ($i = 0;$i	<	$this->imagesAllowed;$i++) { 			// Generate remove text if (($gorumroll->method == "modify_form") && ($this->imageRemove)) { 				$tempRoll = $gorumroll; $tempRoll->list = $itemClassName; $tempRoll->method = "remove_image"; $tempRoll->rollid = $this->id; $tempRoll->imageID = $i; saveInFrom($tempRoll); $remText = $tempRoll->generAnchor($lll["removeImage"]); } else $remText = ""; // Just make the output equal to a single image $temp2 = (file_exists($this->getImageName($i)) ? $this->getImageHTML($i) : ""); if ($temp2 != "") { 				$showCount++; $temp2 .='
'.$remText; } 			$temp[$i] = '
'.$temp2; } 		if ($showCount == 0) $showCount = 1; $item_typ["attributes"]["picture0"] = array( 					"type"=>"VARCHAR", 					"multiple file", 					"max" =>"250", 					"count" => $this->imagesAllowed, 					"extraLabel" => $temp, 					"showCount_dj" => $showCount 				 ); }; 	// NEW CODE DAWID

valid, advertisement.php
This function validates the single image that is uploaded before the image is stored. The rest of the validation is done by the class this one inherits from. Delete it all.

storeAttachment, advertisement.php
This function has been modified almost entirely, just copy over the new function.

function storeAttachment {    global $HTTP_POST_FILES; global $whatHappened, $lll, $infoText; global $adAttDir, $applName, $itemClassName; global $maxPicSize; // New code // Load this class $this->getImageLimits;		// Get the dimensions and stuff allowed $this->getImageExtensions; $parsedAtleastOne = false; $count = 0; // Loop for every image allowed for ($i = 0;$i	<	$this->imagesAllowed;$i++) {		 		if ((isset($this->imageExtensions[$count]) == false)) $this->imageExtensions[$count] = "."; if (strlen($this->imageExtensions[$count]) > 2) { 			$count++; $hasImage = true; } else $hasImage = false; $ind = "picture$i"; if (!isset($HTTP_POST_FILES[$ind]["name"]) || $HTTP_POST_FILES[$ind]["name"]=="") continue; if (!file_exists($HTTP_POST_FILES[$ind]["tmp_name"])) { 			// This should never happen handleError("Temp Image doesn't exists?? WTF"); continue; } 		if (strstr($HTTP_POST_FILES[$ind]["name"]," ")) {        	$infoText .= $lll["spacenoatt"].'
'; continue; } 	   if ($HTTP_POST_FILES[$ind]["tmp_name"]=="none") continue; if ($HTTP_POST_FILES[$ind]["size"] > $maxPicSize) { 	       $infoText .= sprintf($lll["picFileSizeToLarge2"], $maxPicSize).'
'; continue; } 		$fname=$HTTP_POST_FILES[$ind]["tmp_name"]; $size = getimagesize($fname); if (!$size) { 			$infoText.=$lll["notValidImageFile"].'
'; continue; } 		$type = $size[2]; global $g_Extensions;	// Found in image.php if (!isset($g_Extensions[$type])) { 			$infoText .=$lll["notValidImageFile"].'
'; continue; }	 	// We are checking dimensions anymore as we might as well resize the image /*		if( $size[0]>$this->imageMaxSizeX || $size[1]>$this->imageMaxSizeY ) { 			$infoText .=sprintf($lll["picFileDimensionToLarge"], $this->imageMaxSizeX, $this->imageMaxSizeY).'
'; $whatHappened = "invalid_form"; continue; }	*/	 		if ($hasImage) $count--; // Instanciate a new image $image = new myImage; // Read the image $image->ReadImage($HTTP_POST_FILES[$ind]["tmp_name"]); // Remove old pictures and thumbnails cleanDelete($this->getImageName($count)); cleanDelete($this->getThumbName($count)); // Save the image extension $this->imageExtensions[$count] = $g_Extensions[$type]; // Now create our image if ($image->CreateLocal($this->getImageName($count),$this->imageMaxSizeX$,this->imageMaxSizeY)) { 			// Create the thumb $image->CreateLocal($this->getThumbName($count),$this->thumbSizeX$,this->thumbSizeY,true); $parsedAtleastOne = true; $count++; } 		else { 			// Why wasn't it created, could it be because the file format doesn't support resizing if ($image->supported == false) $infoText .=sprintf($lll["picFileDimensionToLarge"], $this->imageMaxSizeX, $this->imageMaxSizeY).'
'; else $infoText.=$lll["imageFileNotLoaded"].'
'; $this->imageExtensions[$count] = "."; } 	}    $HTTP_POST_FILES["picture"]["name"]=""; if ($parsedAtleastOne) { 		$this->updatePictureField; }    return ok; }

showDetails, advertisement.php
Change everything inside

if($this-'>'picture) { ... }

To be

// DAWID if($this->picture) { 		$s.="
\n"; $s.=$this->showListVal("showpic"); $s.="	"; $s.="
\n"; } 	// DAWID

advertisement.php include image.php
at the top of the file call include("./image.php");

Finally More Functions, advertisement.php
Add these new functions to the top of the file (advertisement.php) This first set can go anywhere before the class declaration

/**********************************/ // Advertisement specific image functions function cleanDelete($name) { 	if (file_exists($name)) { 		// Attempt to delete $ret=@unlink($name); if(!$ret) $infoText=sprintf($lll["cantdelfile"],$name); return $ret; } 	return true; }; function getImageExtensionsFromString($string) { 	return	split('[,]', $string); }; function createImageExtensionsStringFromArray($arr) { 	$out = ""; foreach ($arr as $value) { 		$out .= $value.','; } 	return $out; } /**********************************/

These second functions must be placed within the class. Place them just after

class Advertisement extends Item {

Okay

/**********************************/ // Advertisement specific image functions function getImageExtensions { 		if (isset($this->picture)) $this->imageExtensions = getImageExtensionsFromString($this->picture); } 	function getImageName($i) { 		if (!isset($this->imageExtensions[$i])) return ""; global $adAttDir; if ($i != 0) { 			return	$fileName = "$adAttDir/$this->id"."-$i.".$this->imageExtensions[$i]; } 		else return	$fileName = "$adAttDir/$this->id".".".$this->imageExtensions[$i]; } 	function getThumbName($i) { 		if (!isset($this->imageExtensions[$i])) return ""; global $adAttDir; if ($i != 0) { 			return	$thumbName = "$adAttDir/th_$this->id"."-$i.".$this->imageExtensions[$i]; } 		else return	$thumbName = "$adAttDir/th_$this->id".".".$this->imageExtensions[$i]; } 	function getImageHTML($i$,link = false$,target='_blank') { 		if (!isset($this->imageExtensions[$i])) return ""; if (strlen($this->imageExtensions[$i]) < 2) return ""; $picName = $this->getImageName($i);	// Get the first image $thName = $this->getThumbName($i);	// Get the first thumb // If the thumbnail doesn't exists use the original picture's name instead. if (!file_exists($thName)) $thName = $picName; if (!file_exists($picName)) return ""; // Okay now we need to find the dimensions of the thumbnail and scale them for viewing. // If it really is a thumbnail we won't have to scale using html. If it isn't then we have no 		// other choice as the reason no thumb exists is because this format is not supported by php $size = getimagesize( $thName ); $size = RatioImageSize($size,$this->thumbSizeX,$this->thumbSizeY,true); if ($link == false) return "$this->imageSpacer"; else return "$this->imageSpacer"; } 	// Get the image settings from this advert's category function getImageLimits { 		//if (!isset($this->imageLimitsLoaded)) return; global $categoryClassName; $c = new $categoryClassName; $c->id = $this->cid; load($c); $this->imagesAllowed = $c->imagesAllowed; $this->imageRemove = $c->imageRemove; $this->thumbSizeX = $c->thumbSizeX; $this->thumbSizeY = $c->thumbSizeY; $this->imageMaxSizeX= $c->imageMaxSizeX; $this->imageMaxSizeY= $c->imageMaxSizeY; $this->imageLimitsLoaded = true; // Construct the image spacer $this->imageSpacer = str_replace(array('$thumbWidth','$thumbHeight'), 					array($c->thumbSizeX$,c->thumbSizeY),$c->imageSpacer); // Quick validation test if ($c->imagesAllowed) { 			if ($c->thumbSizeX * $c->thumbSizeY * $c->imageMaxSizeX * $c->imageMaxSizeY <= 0) die('Image dimensions impossible'); } 	} 	function Debug($text=false) { 		if (false) { 			echo $text; if (isset($this->imageExtensions)) echo array_to_str($this->imageExtensions); if (isset($this->picture)) echo array_to_str($this->picture); } 	} 	 	function renameImage($from$,to) { 		if (!isset($this->imageExtensions[$from]) || (strlen($this->imageExtensions[$from]) < 2)) { 			$this->imageExtensions[$to] = ""; return; } 		$this->Debug('Before Rename
'); $s = ""; // Collect the names $thumbNameFrom = $this->getThumbName($from); $imageNameFrom = $this->getImageName($from); // Rename the image if (file_exists($imageNameFrom)) { 			$tempExt = $this->imageExtensions[$to]; $this->imageExtensions[$to] = $this->imageExtensions[$from]; $thumbNameTo = $this->getThumbName($to); $imageNameTo = $this->getImageName($to); if (rename($imageNameFrom,$imageNameTo)) { 				if (file_exists($thumbNameFrom)) if (rename($thumbNameFrom,$thumbNameTo) == false) $s .= " Thumbnail $thumbNameFrom couldn't be renamed to $thumbNameTo
"; } 			else { 				$s .= " Image $imageNameFrom couldn't be renamed to $imageNameTo
"; $this->imageExtensions[$to]	= $tempExt; } 		} 		$this->Debug("After Rename:$s
"); return $s; } 	function updatePictureField { 		global $applName, $itemClassName; $newPic = addslashes(createImageExtensionsStringFromArray($this->imageExtensions)); if ($newPic == $this->picture) return; $this->picture = $newPic; $this->Debug; // Create the extensions string $query = "UPDATE $applName"."_$itemClassName SET picture='$this->picture'". " WHERE id=$this->id"; executeQuery( $query ); }            // DAWID JOUBERT function removeImage(&$s) {     global $whatHappened, $charLimit, $infoText, $lll$,gorumroll; global $immediateAppear, $allowModify, $adminEmail, $itemClassName; // Load this class $this->id = $gorumroll->rollid; load($this); global $mainBoxWidth$,mainBoxPadding; $this->hasGeneralRights($rights); if (!isset($mainBoxWidth)) $mainBoxWidth="100%"; if (!isset($mainBoxPadding)) $mainBoxPadding="2"; $s.=generBoxUp($mainBoxWidth$,mainBoxPadding); $s1=showTools($this$,rights); $s.=generBoxDown; $s.=vertSpacer; restoreFrom; $s.="".$gorumroll->generAnchor($lll["back"]).""; hasAdminRights($isAdm); if( !$isAdm && !$allowModify ) {         return; } 	 $infoText = "fdsaafsd"; if (!isset($_GET['imageID'])) $_GET['imageID'] = 0; // Remove image and let user know if (is_numeric($_GET['imageID'])) { 		$i = abs($_GET['imageID']); $infoText = "$i"; // Delete this image if( $this->picture ) {			 			$this->getImageExtensions; if (!isset($this->imageExtensions[$i])) { 				$infoText = $lll["missingImage"]; return; } 			$imgName = $this->getImageName($i); if (file_exists($imgName)) { 				cleanDelete($imgName); cleanDelete($this->getThumbName($i)); $infoText = "Image $i has been deleted. "; // Now move down any other images by renaming them. This is the difficult part! $limit = count($this->imageExtensions); for ($i=$i+1;$i < $limit;$i++) { 					$infoText .= $this->renameImage($i$,i-1); }	 				// Now we must update this $->Picture $this->updatePictureField; } 			else $infoText = $lll["missingImage"]; } 		else $infoText = $lll["missingImage"]; } 	else $infoText =$lll["missingImage"]; } // Map Functionality /**********************************/

gorum/form.php
Open gorum/form.php and modify generForm(..) by adding this to the massive if branch. elseif( in_array("file",$val)) {            $s.=generFileField($attr$,txt, $expl,                                $inputLength, $fieldLength,                                "cell", "", $afterField); } 		// DAWID elseif( in_array("multiple file",$val)) { 			$count = $val["count"]; $s.=generFileField($attr$,txt, $expl, 							  $inputLength, $fieldLength, 							   "cell", "", $afterField,$count, 							   isset($val["extraLabel"]) ? $val["extraLabel"] : false, 							   isset($val["showCount_dj"]) ? $val["showCount_dj"] : false); }		 		// DAWID elseif( in_array("text",$val) ) {            $s.=generTextField("text",$attr$,txt, $expl,                                 $base->{$attr},$inputLength$,fieldLength,                                "cell", "", TRUE, $afterField); }

gorum/generformlib_filebutton.php
Open gorum/generformlib_filebutton.php and go to generFileField(..) and copy the changes (or replace the entire function)

// DAWID JOUBERT function generMultipleFileJavascript($count,$postText,$idUsed,$theHiddenValue,$shownCount="1",$preText="my",$style='') { 	// The big problem is getting init events to load with the page... return "\n "; } // DAWID JOUBERT: Count is used and it represents how many consecutive files the user may upload. // If this is more than one it will add so many fields, including dynamic html (javascript for it). // It will take the field's name and parse a number to it at the end, removing the last current character. // So if you want to use this feature make sure your $name=image0 because 0 will be replaced with the integer count function generFileField($name,$label,$explText,$size="",$maxlength="",                        $tdCl="", $spanCl="", $afterField="",$count=1,$extraLabel = false,$showCount = 1) {     global $list2Colors, $jsElementCount;     $s="";     $labelCl="label";     if (isset($list2Colors))  	{         if ($list2Colors && $tdCl=="cell") {             $tdCl="cell2";             $labelCl="label2";         }         $list2Colors = ($list2Colors + 1) % 2;     } // Dawid Joubert if ($count > 1) { 		$addMore = true; $preText = 'my'; $postText = $name; $idUsed = $preText$.postText; $newName = substr($name,0,-1);	// Remove last character // Okay now generate our javascript! } else $addMore = false; // Dawid joubert // First construct our template field for ($i = 0;$i < $count;$i++) { 		// First Cache the new field $t=""; $t.="
"; if ($spanCl!="") $t.=""; if ($i == 0) $t.=$label; if (isset($extraLabel[$i])) $t.=$extraLabel[$i]; if ($spanCl!="") $t.=""; if($explText && $i = 0) $t.=generExplanation($label,$explText); $t.="	\n"; if ($addMore) $name = $newName$.i; 			$t.="<input type='FILE' name='$name'"; if ($size!="") $t.=" size='$size'"; if ($maxlength!="") $t.=" maxlength='$maxlength'"; $t.=">\n"; $jsElementCount++; $t.=$afterField; $t.="
\n"; // Done caching $s.=$t; } 	// Dawid if ($addMore) { 		if ($showCount != $count) { 			// Show the add more button $t=""; $t.="
	"; if ($spanCl!="") $t.=""; $t.="Add another File"; if ($spanCl!="") $t.=""; $t.="
\n"; $s.= $t; } 		// Insert the javascript just before  global $g_Extras$,g_extraDoOnLoad; $g_Extras.= generMultipleFileJavascript($count$,postText$,idUsed$,name+time,$showCount$,preText$,tdCl); $g_extraDoOnLoad .= "initEvents$idUsed;\n"; }    return $s; }

gorum/object.php
Modify it to this function getDefault( $typ, $attr ) { 	// DAWID if( !isset( $typ["attributes"][$attr] ) ) { return ""; } 	// DAWID else $attrInfo = & $typ["attributes"][$attr]; //if (!isset($attrInfo["type"])) echo "attr:$attr "; if( isset($attrInfo["default"]) ) { return $attrInfo["default"]; }    //if(!isset($attrInfo["type"])) echo $attr; if( ereg("INT", $attrInfo["type"]) ) { return 0; // Note: even if min==1 !!! }    if( ereg("CHAR", $attrInfo["type"]) ) { return ""; // Note: even if min==1 !!! }    if( ereg("TEXT", $attrInfo["type"]) ) { return ""; } }

constants.php
Add this anywhere in constants.php

$allowedMethods["remove_image"] = '$base->removeImage(&$s);';

gorum/init.php
Add this to the bottom of function showHtmlHead

elseif ($language=="lt") { $s.="<META HTTP-EQUIV='content-type' CONTENT='text/html;". " charset=windows-1257'>"; }    $s.="$headTemplate\n"; $s.=$this->showCss; // DAWID JOUBERT HOOK—needed for javascript hooking global $g_Extras$,g_extraDoOnLoad; $s.=$g_Extras; $s.=" "; $s.="\n"; // DAWID JOUBERT return $s; }

Source Code
Download here: http://www.noah.inv.pl/forum/index.php?topic=228.msg656#msg656

Trouble Shooting
Having trouble copying source from wiki?

Wiki errs on some of the characters.. many ' have been changed to ' and should be reverted

Italian Language
The Italian language file has been translated. Here it is:

<?php // If you don't find a language file in your language in this directory, // you should translate this file and save as 'lang_xx.php' (where xx // is the country abbreviation). For how to translate, you can take the // already translated files as an example. // // Some instructions: don't insert any new line breaks in the file however long // a line is! Don't rewrite anything else, only what you translate! Don't // change the order of the lines! Don't write any spaces or new lines after the last line of the file // (careful! some text editors put new lines at the end of the files automatically)! // // Translate the other language file, too: 'gorum/lang/lang_en.php'! // If you are ready with the files, you must write the following line // in 'constants.php' to activate the new language: // $language="xx"; // (of course without the leading '//' comment tag) // // If you are ready with the translation, please, send us the translated // language files (classifieds@phpoutsourcing.com), so that we can release // them in the next version! // // New for translation: $lll["settings_showSubmitAd_expl"]="If this is unchecked, only admin can submit an ad"; $lll["settings_expiration_expl"]="0 means that the ads never expire - i.e. expiration disabled.

Warning: Once you disable ad expiration, don't re-enable it again later any more!"; $lll["u_maintitle"]="Noah's Classifieds update process"; $lll["secure_copy"]="It is recommended to save a rescue copy from the old version of Noah's Classifieds before the update.
Copy the program files in a separate directory and make a data base dump for sure!
Click OK to continue, or Cancel to abort the update process!"; $lll["ready_to_update"]="Ready to update data base %s to version %s?
"; $lll["invalid_version"]="The given version is invalid: %s"; $lll["updateSuccessful"]="The update successfully completed.
Hint: As admin, click on the 'Check' menu point to view the state of the classifieds system!"; $lll["updating"]="Updating from version %s to version %s..."; $lll["already_installed"]="The given software version %s is already installed."; $lll["backToForum"]="Return to the classifieds."; $lll["settings_showChangePassword"]="Mostra 'Cambia password'"; $lll["settings_showLogout"]="Mostra 'Logout'"; $lll["settings_showLogin"]="Mostra 'Login'"; $lll["settings_showRegister"]="Mostra 'Registra'"; $lll["settings_showMyProfile"]="Mostra 'Il Mio Profilo'"; $lll["settings_showMyAds"]="Mostra 'I Miei Annunci'"; $lll["settings_showSubmitAd"]="Mostra 'Invia Annuncio'"; $lll["settings_showRecentAds"]="Mostra 'Annunci Recenti'"; $lll["settings_showMostPopularAds"]="Mostra 'Annunci Popolari'"; $lll["settings_showSearch"]="Mostra 'Cerca'"; $lll["settings_showHome"]="Mostra 'Home'"; $lll["menuPointsSep"]="Impostazioni Menu"; $lll["expirationProperties"]="Impostazioni scadenze"; $lll["imageProperties"]="Limiti upload immagini"; $lll["otherProperties"]="Altre Configurazioni"; $lll["settings_renewal"]="Numero volte che un utente puo' prolungare la scadenza del suo annuncio"; $lll["settings_allowModify"]="L'utente puo' modificare il suo annuncio"; // ShoppingCart: $lll["addToChart"]="Aggiungi al carrello"; $lll["shoppingCartLink"]="Link al carrello"; $lll["addedToTheCart"]="The item has been added to the end of the cart. Increase the amount if you want to purchase more items!"; $lll["shoppingcart"]="shopping cart item"; $lll["shoppingcart_ttitle"]="My shopping cart"; $lll["shoppingcart_recent_ttitle"]="Most recent purchases"; $lll["shoppingcart_track_ttitle"]="My purchases"; $lll["shoppingcart_title"]="Item title"; $lll["shoppingcart_ownerName"]="User"; $lll["shoppingcart_amount"]="Amount"; $lll["shoppingcart_price"]="Prezzo"; $lll["myCart"]="My shopping cart"; $lll["advertisement_price"]="Prezzo"; $lll["total"]="Prezzo totale"; $lll["purchase"]="Purchase"; $lll["amountModified"]="The amount has been successfully modified."; $lll["loginToPurchase"]="You must log in first to add an item to your shopping cart."; $lll["classifiedsuser_viewOrdersLink"]=""; $lll["viewOrders"]="View orders"; $lll["usersShoppingCart"]="Orders of %s"; $lll["shoppingcart_orderNumber"]="Order #"; $lll["shoppingcart_orderDate"]="Purchase-shippment date"; $lll["shoppingcart_status"]="Status"; $lll["shoppingcart_status_".Shoppingcart_new]="New"; $lll["shoppingcart_status_".Shoppingcart_payed]="Payed"; $lll["shoppingcart_status_".Shoppingcart_processed]="Shipped"; $lll["ordered"]="p: %s"; $lll["shipped"]="s: %s"; $lll["recentPurchases"]="Recent purchases"; $lll["trackPurchases"]="My purchases"; $lll["classifiedsuser_fullName"]="Full name"; $lll["classifiedsuser_address"]="Address"; $lll["classifiedsuser_city"]="City"; $lll["classifiedsuser_state"]="State"; $lll["classifiedsuser_zipCode"]="Zip code"; $lll["purchaseSuccessful"]="Your purchase has been successfully completed"; $lll["purchaseFailed"]="Your purchase has been failed"; $lll["purchaseFailedNetworkError"]="Your purchase has been failed, since VeriSign couldn't access the MIJ site. Please, contact the site administrator!"; //confcheck $lll["mailok"]="Il test di invio e.mail e' stato superato brillantemente."; $lll["mailerr"]="Ho riscontrato i seguenti errori durante il test di invio e.mail:
%s"; $lll["mailerr_expl"]="There are some features in Noah's Classifieds that necessitates sending out mails. Our program applies standard mail headers which are readable by the majority of mail servers. However, there are some mail servers (mostly Windows based) that would require a non-standard mail header. With these mail servers (yours seems to be amongst (or you might not have a mail server at all!), unfortunately), Noah's Classifieds may not be able to send out mails."; $lll["here1"]="click qui"; $lll["confpreerr"]="There are some characters before the <? in the config file! Please delete these characters (newlines and spaces too)!"; $lll["confposterr"]="There are some characters after the ?> in the config file! Please delete these characters (newlines and spaces too)!"; $lll["conffileok"]="The config file seems to be ok."; $lll["congrat"]="Congratulazioni! Hai installato con successo bachecaweb!"; $lll["confcheck"]="System configuration checking..."; $lll["confdisapp"]="If you want to begin to work with the software and you want this page to disappear"; $lll["confclicheck"]="You can access this configuration checking page whenever you want if you click on the 'Check' link in the menubar."; $lll["chadmemail"]="Your current email adress is admin@admin.admin. Please set it correctly clicking on the 'My profile' link on the menubar!"; $lll["chsyspass"]="Your current system email adress is system@system.system. Please set it correctly clicking on the 'Settings' link on the menubar!"; $lll["chadmpass"]="The default admin password is not changed yet! Please change it clicking on the 'Change password' link on the menu bar!"; $lll["settings_adminEmail"]="System email"; $lll["nogd"]="Warning: your server doesn't have an installed GD library."; $lll["nogd_expl"]="(This library is responsible in php programs for the image manipulation, so it might be anyway useful if you put it on your server. In our program it is called for creating thumbnail images to the full sized uploaded pictures. Without this support the program can't generate thumbnails, this way the browser have to shrink 'on-the-fly' each big image in each pages where thumbnails can appear. This method works, but it is far from effective (the page have to download every time every big image). )"; $lll["nopermission"]="The server process has no write permission under the 'pictures/listings' and/or 'pictures/cats' directories.
You should go in 'pictures' and execute the following Unix command (in Unix systems, of course):
chmod 777 listings cats"; $lll["nopermission_expl"]="(Noah's Classifieds tries to save the advertisement pictures under 'pictures/listings' and the category pics under 'pictures/cats'. You have to make sure the program has enough permission to do this.)"; //- $lll["ss_blue"]="Blue"; //general $lll["name"]="Nome"; $lll["home"]="Home"; //user overwritten: $lll["classifiedsuser"]=$lll["user"]; $lll["classifiedsuser_newitem"]=$lll["user_newitem"]; $lll["classifiedsuser_name"]="Username"; $lll["classifiedsuser_email"]=$lll["user_email"]; $lll["classifiedsuser_lastClickTime"]=$lll["user_lastClickTime"]; $lll["classifiedsuser_password"]=$lll["user_password"]; $lll["classifiedsuser_passwordCopy"]=$lll["user_passwordCopy"]; $lll["classifiedsuser_rememberPassword"]=$lll["user_rememberPassword"]; $lll["classifiedsuser_notes"]=$lll["user_notes"]; $lll["classifiedsuser_create_form"]=$lll["user_create_form"]; $lll["classifiedsuser_remind_password_form"]=$lll["user_remind_password_form"]; $lll["classifiedsuser_login_form"]=$lll["user_login_form"]; $lll["classifiedsuser_modify_form"]=$lll["user_modify_form"]; $lll["classifiedsuser_change_password_form"]=$lll["user_change_password_form"]; $lll["classifiedsuser_ttitle"]="Utenti"; $lll["paymentSection"]="Informazioni Pagamento"; $lll["loggedinas"]="Sei entrato come %s."; $lll["regorlog"]="Registrati o fai il login!"; $lll["my_profile"]="Il Mio Profilo"; //category: $lll["classifiedscategory"]=$lll["category"]; $lll["classifiedscategory_newitem"]=$lll["category_newitem"]; $lll["classifiedscategory_create_form"]=$lll["category_create_form"]; $lll["classifiedscategory_modify_form"]=$lll["category_modify_form"]; $lll["classifiedscategory_allowAd"]="Consenti annunci"; $lll["classifiedscategory_description"]="Descrizione"; $lll["classifiedscategory_picture"]="Immagine"; $lll["classifiedscategory_ttitle"]="Categorie Annunci"; $lll["cat_main_tit"]="Categorie Annunci"; $lll["modcat"]="Modifica questa Categoria"; $lll["delcat"]="Cancella questa Categoria"; $lll["subcats"]="Sottocategorie"; $lll["itemnum"]="Annunci"; $lll["directsubcats"]="Sottocategorie dirette"; $lll["directitemnum"]="Annunci diretti"; // Dawid Joubert Image Editing $lll["imagesAllowed"]="Numero di immagini permesse"; $lll["thumbSizeX"]="anteprima size X"; $lll["thumbSizeY"]="Anteprimasize Y"; $lll["imageMaxSizeX"]="Massima dimensione dell'immagine asse X"; $lll["imageMaxSizeY"]="Massima dimensione dell'immagine asse Y"; $lll["imageSpacer"]="Testo HTML da inserire dopo ogni immagine (usato come spazio)"; $lll["pictureTemp"]='Immagini'; $lll["imageFileNotLoaded"]='Immagine non salvata/creata!'; $lll["removeImage"] = "Rimuovi questa immagine"; $lll["missingImage"] = "L'immagine non esiste, impossibile rimuoverla!"; $lll["detail_removeImage"] = "Rimuovi immagine"; $lll["imageRemove"] = "Abilitare il bottone di rimozione immagine?"; //advertisements: $lll["advertisements"]="Annunci"; $lll["advertisement"]="Annunci"; $lll["advertisement_newitem"]="Invia Annuncio"; $lll["advertisement_create_form"]="Invia Annuncio"; $lll["advertisement_modify_form"]="Modifica Annuncio"; $lll["advertisement_title"]="Titolo"; $lll["advertisement_ttitle"]="Annunci in questa Categoria"; $lll["advertisement_my_ttitle"]="I Miei Annunci"; $lll["advertisement_description"]="Descrizione"; $lll["advertisement_cid"]="Categoria"; $lll["advertisement_cName"]="Categoria"; $lll["advertisement_clicked"]="Visto"; $lll["advertisement_responded"]="Risposte"; $lll["advertisement_ISSN"]="ISSN"; $lll["advertisement_example"]="Esempio"; $lll["advertisement_expirationTime"]="Giorni rimanenti prima della scadenza"; $lll["keepPrivate"]="Nascondi i campi Privati"; $lll["expirationProlonged"]="La data di scadenza e' stata prolungata con successo."; $lll["prolongExp"]="Prolunga"; $lll["lastRenewal"]="
Questo era l'ultimo prolungamento possibile."; $lll["rating"]="Rating"; $lll["advertisement_keywords"]="Parole"; $lll["advertisement_frequency"]="Frequenza"; $lll["advertisement_url"]="URL"; $lll["advertisement_my_title"]="I Miei Annuci"; $lll["advertisement_inactive_title"]="Immissioni inattive"; $lll["advertisement_active"]=$lll["item_active"]; $lll["ad_limit_exc"]="Il limite massimo e' di %s caratteri. Tu hai scritto %s caratteri! Abbrevia il tuo annuncio, grazie!"; $lll["inactives"]="Annunci inattivi"; $lll["new_resp"]="Rispondi a questo annuncio"; $lll["response_create_form"]="Rispondi a questo annuncio"; $lll["yourname"]="Il tuo nome"; $lll["youremail"]="La tua Email"; $lll["friendsname"]="Il nome del tuo amico"; $lll["friendsemail"]="La Email del tuo amico"; $lll["response_mess"]="Il tuo messaggio"; $lll["friendmail_mess"]="Il tuo messaggio"; $lll["mail_sent"]="L'annuncio e' stato inviato correttamente."; $lll["mail_fr_sent"]="Abbiamo inviato l'Email al tuo amico."; $lll["clickclose"]="Chiudi questa finestra."; $lll["new_frie"]="Invia annuncio ad un amico"; $lll["friendmail_create_form"]="Invia annuncio ad un amico"; $lll["advertisementActive"]="Annuncio Approvato"; $lll["advertisementInactive"]="Annunci in Attesa"; $lll["advertisement_active"]="Approvato"; $lll["advertisement_picture"]="Immagine"; $lll["advertisement_active_ttitle"]="Annunci Approvati"; $lll["advertisement_inactive_ttitle"]="Annunci in Attesa"; $lll["approve"]="approva"; $lll["adApproved"]="L'annuncio e' stato approvato"; $lll["adScheduled"]="e' in attesa di approvazione. Riceverai una e.mail di notifica."; $lll["N/A"]="N/A"; $lll["popular"]="Piu' popolari"; $lll["advertisement_popular_ttitle"]="Lista Annunci Popolari"; $lll["adnum"]="annunci"; // picture upload $lll["picFileSizeToLarge1"]="Errore! Non posso aprire l'immagine allegata, o l'immagine e' troppo grande."; $lll["picFileSizeNull"]="L'immagine allegata presenta degli errori."; $lll["picFileSizeToLarge2"]="L'immagine scelta come allegato supera il massimo consentito di %s byte"; $lll["picFileDimensionToLarge"]="Le dimensioni dell'immagine scelta come allegato superano il massimo consentito di %s x %s"; $lll["notValidImageFile"]="Il file scelto non e' una immagine valida (deve essere gif, jpg, o png)."; $lll["cantOpenFile"]="Errore nell'apertura del file!"; $lll["cantdelfile"]="Alcune immagini caricate potrebbero non essere state cancellate."; //globalsettings $lll["settings_expiration"]="Giorni alla scadenza dell'annuncio"; $lll["settings_expNoticeBefore"]="Numero di giorni antecedenti in cui l'utente viene avvisato della scadenza del suo annuncio"; $lll["settings_charLimit"]="Numero dei caratteri massimi consentiti per un annuncio"; $lll["settings_immediateAppear"]="Un nuovo annuncio appare immediatamente"; $lll["settings_blockSize"]="Annunci mostrati per pagina"; $lll["settings_maxPicSize"]="Pesantezza massima dell'immagine in bytes"; $lll["settings_maxPicWidth"]="Larghezza massima dell'immagine in pixels"; $lll["settings_maxPicHeight"]="Altezza massima dell'immagine in pixels"; $lll["settings_thumbnailWidth"]="Larghezza Thumbnail"; $lll["settings_thumbnailHeight"]="Altezza Thumbnail"; //search $lll["classifiedssearch"]="Cerca"; $lll["classifiedssearch_type_".search_all]=$lll["search_type_".search_all]; $lll["classifiedssearch_type_".search_any]=$lll["search_type_".search_any]; $lll["classifiedssearch_relationBetweenFields_".search_allFields]="tutte le condizioni"; $lll["classifiedssearch_relationBetweenFields_".search_anyFields]="qualsiasi condizione"; $lll["classifiedssearch_create_form"]="Cerca Annunci"; $lll["classifiedssearch_modify_form"]=$lll["search_modify_form"]; $lll["classifiedssearch_autoNotify"]=$lll["search_autoNotify"]; $lll["classifiedssearch_relationBetweenFields"]="Cerca risultati che includono"; $lll["classifiedssearch_str"]=$lll["search_str"]; $lll["classifiedssearch_type"]=$lll["search_type"]; $lll["classifiedssearch_cid"]="Categoria"; $lll["classifiedssearch_title"]="Contenuto del titolo"; $lll["allCategories"]="Tutte le categorie"; $lll["advertisement_search_ttitle"]="Risultati della Ricerca"; $lll["advancedSearch"]="Ricerca avanzata nella catagoria - cerca annuncio che:"; $lll["contains"]=" contiene"; $lll["is"]=" e'"; $lll["any"]="qualsiasi"; $lll["forAddvancedSearch"]="Per una ricerca avanzata in una specifica Categoria, entra nella Categoria prescelta e clicca su 'Cerca'!"; // Variable Fields // fatto sino a qui guido $lll["variableFields"]="Definisci variabili"; $lll["varfields_modify_form"]="Definisci le variabili per gli annunci di questa categoria"; $lll["varfields_modifydetails_form"]="Dettagli dei campi variabili"; $lll["varfields"]="Variabili"; $lll["defineTheValues"]="Definisci i valori possibili del campo di selezione."; $lll["defineTheName"]="Definisci il nome dei campi attivi."; $lll["mustBeCommaSeparated"]="I valori possibili devono essere separati da virgola"; $lll["invalidDefaultValue"]="Il valore di Default deve essere uno dei valori separati da virgola del campo di selezione."; $lll["descriptionDefaultLabel"]="Descrizione"; $lll["showCreationTime"]="Mostra data di Creazione nella Lista"; $lll["showExpirationTime"]="Mostra data di Scadenza nella Lista"; $lll["privateField"]="Privato"; global $variableFieldsNum; for( $i=0; $i<$variableFieldsNum; $i++ ) {    $lll["type_$i"."_".varfields_text]="Text"; $lll["type_$i"."_".varfields_textarea]="Textarea"; $lll["type_$i"."_".varfields_bool]="Boolean"; $lll["type_$i"."_".varfields_selection]="Seleziona"; $lll["type_$i"."_".varfields_multipleselection]="Seleziona Multipla"; $lll["type_$i"."_".varfields_separator]="Separatore"; $lll["name_$i"]="Nome"; $lll["type_$i"]="Tipo"; $lll["type_$i"."_expl"]="Note: To avoid type conflicts, if you have ever set this column to active and there are already advertisements in this category, you can't change the type any more. If you insist on changing the type anyway, you have to remove all advertisements from the category first."; $lll["default_$i"]="Valore di Default"; $lll["active_$i"]="Attivo"; $lll["separator_$i"]="Colonna ".($i+1)."."; $lll["mandatory_$i"]="Obbligatorio"; $lll["list_$i"]="Appare nella lista"; $lll["values_$i"]="Valori Possibili"; $lll["innewline_$i"]="Inserisci in una nuova linea"; $lll["searchable_$i"]="Ricercabile"; $lll["badwords_$i"]="Applica Bad Words"; $lll["allowHtml_$i"]="Consenti HTML"; $lll["private_$i"]="Consenti Annuncio Privato"; $lll["hidden_$i"]="Visibile solo da Admin"; $lll["format_$i"]="Display format"; $lll["format_$i"."_expl"]="You can use it a C-style sprintf format string"; } // Ha ez be van allitva akkor a formokban a privatta teheto mezok neve // utan irodik: $lll["private_field"]="(private)"; // Menu points: $lll["classifiedscategory_new"]=$lll["category_new"]; $lll["classifiedscategory_del"]=$lll["category_del"]; $lll["classifiedscategory_mod"]=$lll["category_mod"]; $lll["advertisement_my"]="I Miei Annunci"; $lll["advertisement_Active"]="Annunci Approvati"; $lll["advertisement_Inctive"]="Annunci in Attesa"; $lll["advertisement_recent"]="Annunci Recenti"; $lll["advertisement_popular"]="Annunci Popolari"; //misc $lll["myads"]="I Miei Annunci"; $lll["modcss"]="Stylesheet"; $lll["creationtime"]="Creato"; $lll["allemails"]="Email"; $lll["allemails_tit"]="Tutte le Email nel sistema"; $lll["recentadded"]="Annunci Recenti"; $lll["advertisement_all_ttitle"]="Annunci aggiunti di recente"; $lll["registerOrLoginToSubmit"]="Registrati e fai il login per inviare i tuoi annunci!"; $lll["selectSubcat"]="Seleziona una sottocategoria per inserirvi il tuo annuncio!"; $lll["loggedas"]="Sei entrato come %s."; $lll["logorreg"]="Registrati o fai il login."; $lll["showpic"]="Immagine"; ?>


text:
User talk:69.109.226.227

Thank you for experimenting with Wikibooks by creating the page Gufu. Your test worked, and has been or will soon be removed. Please use the sandbox for any other tests you want to do. Take a look at the welcome page if you would like to learn more about contributing.--Az1568 20:29, 17 September 2006 (UTC)

license: Creative Commons - Attribution Share-Alike - https://creativecommons.org/licenses/by-sa/4.0/

title: User talk:69.109.226.227


text:
User talk:Dawidjoubert

Welcome
Hello and welcome to Wikibooks!

Here are some tips to help you get started:
 * You can sign your name on Talk and vote pages using four tildes, like this: ~~~~.
 * Remember to conduct any editing experiments in the sandbox.
 * Check out our help page if you need additional help.
 * Eventually, you might want to read the Manual of Style and Policies and Guidelines.
 * Take a look at Naming policy
 * See list of templates which can save your time
 * Remember to maintain a Neutral point of view.
 * Explore, be bold in editing pages, and have fun!

You will find more resources in Community Portal. If you want to ask a question, visit the Study help desk, the Staff lounge, IRC channel or ask me personally on my talk page.

Good luck! --Derbeth talk 21:32, 17 September 2006 (UTC)

Image copyright problem with Image:Noah-multi-image-dawidjoubert.jpg
Thanks for uploading Image:Noah-multi-image-dawidjoubert.jpg. However, the image may soon be deleted unless we can determine the copyright holder and copyright status. The Wikimedia Foundation is very careful about the images included in Wikibooks because of copyright law (see Wikibooks' Copyright policy).

The copyright holder is usually the creator, the creator's employer, or the last person who was transferred ownership rights. Copyright information on images is signified using copyright templates. The three basic license types on Wikibooks are open content, public domain, and fair use. Find the appropriate template in Image copyright tags and place it on the image page like this:.

Please signify the copyright information on any other images you have uploaded or will upload. Remember that images without this important information or giving false information can be deleted by an administrator. If you have any questions, feel free to contact me, or ask them at the Study help desk. Thank you. Derbeth talk 21:32, 17 September 2006 (UTC)

Welcome to Computing
Thanks for your work on the computing section, it looks excellent. Please take a look around and any other work you can do would be greatfully recieved. Any help I can provide please get in touch. Welcome! Pluke 11:27, 20 September 2006 (UTC)

title: User talk:Dawidjoubert


title: User:Dsgncr8or


text:
Movie Making Manual/Character Animation

There are two kinds of animation used in the making of a motion picture. Animated movies have a special procedure and the animation is done in Production. This section covers the procedure for creating an animated movie.

Animation is also done in Post Production as part of visual effects. For visual effects, go to Animation for Visual Effects.

Overall Procedure of an Animated Motion Picture
An animated motion picture starts out like any other motion picture. Pre-production is the same and that includes storyboarding. The only difference is that, storyboarding for an animated motion picture is much more intense. In live action filming, the storyboards are only an approximation. In an animated motion picture, the storyboards eventually become the keyframes of the animation.

Dialogue Recording
All text books on making an animated motion picture explain that before the animation can begin, the dialog of the script must be recorded by the actors. The textbooks say that only after the actor's dialog has been recorded does work begin on the animation.

The problem is, this method does not work. Actors have too much trouble visualizing who they are and their surroundings in an animated movie. Their performance is terrific when they can see the animation but not good when they cannot see anything.

Therefore, in almost all cases, the dialog must be recorded a second time after the animation is finished. To see that this is true, go through the "making of the movie" articles for all the successful animated movies and you will learn that they recorded the dialog a second time while the actors watch the animation.

 * Dialog Recording vs. ADR Session
 * To keep the two recording sessions separate, I will call the first recording of the dialog, the "Dialog Recording". And the second recording of the dialog after the movie is almost finished, the "ADR Session" since the second recording of the dialog is very much like a normal ADR session with a few exceptions.

Dialogue Recording Procedure
There are two different ways to record the initial dialog for an animated motion picture.

 * One Actor at a Time
 * The first way is the easy way. This is to bring in each actor, one at a time, and record that persons dialog.  This recording session is with the director who will coach the actor by either reading the other character's dialog or will explain each scene to the actor.

 * Multiple Actors
 * This is much more difficult. Two or more actors are brought into the recording studio and if possible, put into separate (isolated) recording booths connected to the same recording console.  The actors can hear each other as they record their dialog together.  This way, the two actors interact with each other but their voices are recorded on separate tracks.

 * If the two actors are in the same recording booth, and if the actors happen to be speaking at the same time (as people often do in a heated conversation), this becomes locked into the dialog recording. There can be no adjustment during the editing of the movie.

 * Therefore, recording each actor on a separate track is preferable.

The other Steps of Making the Animated Movie
Here are the steps for creating the animated movie once the dialog has been recorded.

Animatic Creation Procedure
Using the still images from the storyboard, an animatic is created using the recorded dialog. Another way to explain this is the movie is made using just still pictures along with the dialog as well as with a temp film score and rough sound effects.

Timing Procedure
Once the dialog is recorded and the animatic completed, the dialog must be timed. For each scene, each syllable of the dialog must be timed from the beginning of the scene. This is needed for the animators to create the animation and rough lip sync.

Animation Procedure
Once the timing of each scene is complete the animation is started. For 3D animation, each shot is rendered just like a motion picture shot on film with live actors. Then these shots are edited together.

This is very different from 2D animation where each frame is carefully planned out and no extra frames are created. In 3D animation, about 10% of the rendered frames are removed (trimmed off the two ends of the shot) during editing.

If ADR will be used, the actual lip sync can still be very rough or not at all.

Editing Procedure
For 3D animation, a regular digital video editing program (such as Final Cut Pro or Adobe Premeire) is used to edit the movie. The sound effects and the musical score are added now. The musical score might even have been created before the editing so that the movie will be edited to match the film score.

Dialogue Recording Procedure
Once the animation is done and the movie has been edited, all the actors return, one at a time, to an ADR session where the actors see everything that is happening on the screen and they react to it.

Lip Sync Timing Procedure
Now the final timing of the lip sync is calculated. Then the animation for the mouth movements is done to match the timing. Some animation software have faster ways to do this. This is the last step in the animation process.

Types Of Animation
There are two kinds of 3D character animation.

 * General Purpose 3D Animation Programs
 * This is done with programs such as Maya, LightWave, and 3D Studio Max. In this case, all characters in the movie are custom made.  All the movie sets and the scenery are created from scratch.

 * Special Purpose 3D Animation Programs
 * This is done with specialized programs such as Poser and DAZ Studio. In this case, most all the characters are purchased off the shelf from companies such as RuntimeDNA.  Frequently, specialized programs are also used to create the movie set.  These programs are Vue and Bryce.  For low budget animation, the movie sets will be rendered as multi-layered still images which are composited with the character animation and (at the same time) animated with Adobe AfterEffects.

 * Examples of animation motion pictures created with general purpose 3D animation program are Polar Express and Aero-Troopers. Polar Express uses realistic human figures while Aero-Troopers uses cartoon-like characters which are easier to animate.

 * Examples of animation motion pictures created with special purpose 3D animation program can be seen overseas in television dramas.

More Info

 * For more information on creating motion picture with special purpose 3D programs, see the section on Digital Puppets (coming soon!).

 * Animation with DAZ Studio - Tutorial at Wikiversity.

title: Movie Making Manual/Character Animation


text: User talk:Dsgncr8or

title: User talk:Dsgncr8or


text:
History of Flight

 * /About/
 * /Authors/
 * /Contributing/
 * 1) /Introduction/
 * 2) /Timeline/
 * 3) /Antiquity/
 * 4) /Middle Ages/
 * 5) /19th Century/
 * 6) /Lighter than air/
 * 7) /Airship//
 * 8) /Heavier than air/
 * 9) /Jet Engine/
 * 10) /Unmotorised/

title: History of Flight


text:
Ayyavazhi/Ayya Vaikunda Avataram

The Ayya Vaikunda Avataram is a festival celebrated by the followers of Ayyavazhi on the 20th day of the Tamil Month of Masi, the date on which the Ayyavazhi followers believe that Lord Vaikundar arose from the sea at Thiruchendur as the son of Mummorthies to destroy the evil spirit of Kali and transform the Kaliyukam into Dharma Yukam.

This is the only Ayyavazhi festival which is celebrates 'at a time' in all worship centres of Ayyavazhi on 19th Masi (3rd March), the day before the date of incarnation of Vaikundar.

A grand procession originates from Thiruchendur to Nagercoil on the 19th of Masi representing the way of Vaikundar after the Avataram to Detchanam, and another procession starts from Thiruvananthapuram to Nagercoil, on the same date representing the release of Lord Vaikundar from the Jail of Singarathoppe.

Both the Thiruchendur and Thiruvananthapuram processions unifies at Athalavilai. The  'Vaikunda Jyothi'  is lighted on the top of a hillock Vaikunda malai at Athalavilai. Then the procession proceeds to Nagercoil. A religious conference is held there in Nagercoil. It is followed by cultural and religious programs etc. Ayyavazhi devotees from all over the nation stays here over the night.

On the next day on 20th of Masi, (4 th March) 'The Great Masi Procession' begins early in the morning from Nagercoil. This is a on-foot procession and people walk following the vahana, chanting Ayya  'Siva-siva Siva-siva Ara-kara Ara-kara' . The participants will hold a saffron flag on their hands. Decorated Elephants and horses participate in this procession. Hundreds of Vehicles follows the procession and the so the transport on Nagercoil-Kanyakumari Highway will be closed on that day. This is one of the largest festivals of the state which attracts a huge crowd beyond the state.

This day was announced as a holiday by the government of Tamil Nadu for the districts of Kanyakumari from ten years back and for Tirunelveli and Tuticorin from this year(2006).

title: Ayyavazhi/Ayya Vaikunda Avataram


text:
Trombone

Music Theory Basics

 * /Basic Concepts in Musical Theory/
 * /Notes/
 * /Keys and Scales/

How to Play

 * /Holding and Moving the Instrument/
 * /Slide Positions/
 * /Basic Playing Concepts/
 * /Maintaining the Instrument/
 * /Slurs and Ties/
 * /Gliss and Slurs/
 * /Legato Tongue/

title: Trombone


text:
Trombone/Basic Concepts in Musical Theory

There are four basic aspects of music:

Rhythm
 * Deals with note duration, speed and stress — the time aspect

Melody
 * Deals with a series of notes — the horizontal aspect.

Harmony
 * Deals with notes played concurrently — the vertical aspect.

Timbre
 * Deals with the physical sound of notes — the depth aspect.

These, generally speaking, all support each other. The melody is what you generally hear as the dominating sound. The trombone, being a low/medium brass instrument, usually plays the harmony (which is usually the background sound) in most bands and orchestras and the countermelody in jazz and rock groups.

The Staff
A staff is where the music is written.

On a staff, there a five 'lines' and four 'spaces'. The notes go on the lines or spaces. Many times, you'll have to go high or lower than what's written on the staff. Lines will have to be written to direct you on which note to play. These are ledger lines.

Clefs

A clef is a symbol used in musical notation that assigns the pitch of notes to lines and spaces on the musical staff. The trombone usually uses the bass clef (F-clef), although eventually you might have to learn the tenor (C-clef) and treble (G-clef) for extended high parts in orchestral music. In the F-clef, the line between 2 dots is the F below middle C. In the C-clef, the line between the two bumps is middle C. In the G-clef, the line encompassed by the little spiral is the G above middle C. These definitions are true no matter where the clef is placed. However, there are certain standard positions for each clef. Bass clef, which is the most common F-clef, defines the second line from the top as the F below middle C. Tenor clef, the C-clef most commonly used for trombones, defines the second line from the top as middle C. Treble clef, the most common G-clef, defines the second line from the bottom as the G above middle C. The only other clef which you are likely to see ever is alto clef, which is a C-clef that defines the middle line as middle C. Alto clef is rarely used except for viola parts and 1st trombone parts in very old orchestral music. However, most of these 1st trombone parts are available in either bass or tenor clef, so as a trombone player, you will probably never need to be proficient reading alto clef.

Time signature
The time signature (also known as "meter signature") is a notational device used in Western musical notation to specify how many beats are in each bar and what note value constitutes one beat. You'll learn more about that next section.


text:
Trombone/Slide Positions

These are the fundamental notes and positions you need to learn.

This slide position chart shows where the bar of the outer slide should be in each position. The top line is valid for all tenor and bass trombones, the second line for all bass trombones and tenor trombones with an F-attachment, and the last line is only for bass trombones.

The notes that are commonly played in each position without any attachments engaged are as follows: 5 y

1: B♭, F, B♭', D', F'

2: A, E, A', C#', E'

3: A♭, E♭, A♭', C', E♭'

4: G', D, G, B, D' (alt)

5: G♭', D♭, G♭, B♭' (alt), D♭' (alt)

6: F', C, F (alt), A' (alt), C' (alt)

7: E', B, E (alt), G#' (alt), B' (alt)

7:	E2/Fb2	B2/Cb2	F#3/Gb3	C#4/Db4	G#4/Ab4

6:	E#2/F2	B#3/C3	G3	D4	A4

5:	F#2/Gb2	C#3/Db3	G#3/Ab3	D#4/Eb4	A#4/Bb4

4:	G2	D3	A3	E4/Fb4	B4/Cb4

3:	G#2/Ab2	D#3/Eb3	A#3/Bb3	E#4/F4	B#5/C5

2:	A2	E3/Fb3	B3/Cb3	F#4/Gb4	C#5/Db5

1:	A#2/Bb2	E#3/F3	B#4/C4	G4	D5

You should notice a pattern.

F Attachments
Some trombones include an F attachment. The attachment makes the instrument the equivalent of 5 positions longer when the trigger is activated. This allows the player to play 6th position notes in 1st, and 7th position notes in 2nd. The trigger can also extend the range of the instrument by allowing the player to reach lower notes than usually possible by using the trigger beyond 2nd position.

title: Trombone/Slide Positions


text:
Announcing/Wanted Modules

This page is simply a list of links to topics that could (and perhaps should) become part of this wikibook, but they have yet to be started. A "module" is simply a "page" in a wikibook. Modules can be very short or quite lengthy. Every module also has its own discussion page, where you may add comments, criticisms or other supplemental content. Groups of modules can also be nested hierarchically as appropriate to help with the organization of the text.

Anyone can add topics to this list. Just click the "edit this page" tab and add your own "wanted module" to this page. Try to follow the convention you will find on the edit page of putting topics in double brackets and prefacing them with the word Announcing and a slash. This will help keep the "red links" internal to this wikibook. The wiki software automatically puts links to pages that have yet to be created in a red font. If any of the links below are blue instead of red, someone has started working on that page, and the link should be moved from this page to the Table of Contents page.

Note that this page doesn't have to be kept in any particular order, although you should feel free to help organize the topics if you like.

Wanted Modules: General

 * /AFTRA/
 * /Weather reporting/
 * /Satellite Radio/

Wanted Modules: Disc Jockeying

 * /Beat Mixing/
 * /DJ Software/

Wanted Modules: Sports Announcing

 * /Football play-by-play/
 * /Football color commentary/
 * /Serving as a spotter/
 * /Racetrack announcing/
 * /Basketball play-by-play/

title: Announcing/Wanted Modules


text:
Announcing/Contributors

Philip A. Thompsen, Ph.D.
Dr. Thompsen is a professor in the Department of Communication Studies at West Chester University of Pennsylvania.

This book was started on August 13, 2006 by Philip A. Thompsen, Ph.D., to support his course on broadcast performance at West Chester University.

Ashlie Hardway
Ashlie Hardway is employed at KVIA, a television station in El Paso, Texas.

title: Announcing/Contributors


text:
User talk:Jen A

I fixed the page problem, and renamed it to Human Physiology/The Urinary System, like you wanted. I fixed the link on the main page, and in the navigation template. For future reference, links to pages are case-sensitive, so Human Physiology/The Urinary System is not the same as Human Physiology/The urinary system. Please let me know if you need anything else. --Whiteknight (talk) (projects) 02:09, 18 September 2006 (UTC)

title: User talk:Jen A