/*   
	project:   		  Cat Software Applications
	author:    		  Chigozie (Cat) Nduanya
	client:    		  Chigozie (Cat) Nduanya
	date:      		  December 08, 2009
	file-name: 		  cat_tools.js
	file-type: 		  JavaScript Script File
*/
var loading='<img src="../images/thumbnails/loading.gif" height="24" width="32" alt="" />';
cat.tools=function(){
	//usage example: cat.addComponentFunctionality(cell,'contact'); //requires cat.executeAddFunctionality();
	cat.addComponentFunctionality=function(cell,title){
		var addButton='<a href="javascript:" title="add new '+title+'">add</a>';
		cell.append('<span class="add-'+title+'-component">&nbsp;<span></span>&nbsp;'+addButton+'</span>');
		var container=$cat('.add-'+title+'-component');
		container.find('a').click(function(){
			if(container.find('input:text').length==0){
				container.find('span').html('<input type="text" class="textbox" />').find('input:text')
				.change(function(){
					if(this.value!='')this.value=cat.strip({string:this.value,characters:cat.characters('alpha_numeric')});
				}).fadeOut('slow').fadeIn('slow');
			}
			else{
				cat.executeAddFunctionality();
				container.find('input:text').remove();
			} 
		});
	};//cat.addComponentFunctionality() ends here...
	
	//usage example: cat.meow(userId=1,applicationId=1,folderTabIndex=0,datasheetTaskIndex='');	
	cat.meow=function(userId,applicationId,folderTabIndex,datasheetTaskIndex){
		cat.userId=userId;
		cat.applicationId=applicationId;
		cat.folderTabIndex=folderTabIndex;
		cat.datasheetTaskIndex=datasheetTaskIndex;
		cat.data='&user_id='+cat.userId+'&application_id='+cat.applicationId+'&folder_tab_index='+cat.folderTabIndex+
				 '&datasheet_task_index='+cat.datasheetTaskIndex+cat.extraData;
		var lines='<p><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /><br /></p>';
		$cat(document.body).html(lines+'<p class="color-white text-center">'+loading+' Generating content...</p>');
		cat.feedback=function(feedback){
			var core={
				processor:function(){
					var canvas=$cat(document.body).html('<div class="canvas">'+feedback+'</div>').find('.canvas');
					$cat('.current-menu-item').css({'background':Colors.blue,'color':Colors.white});
					$cat('.page-menu-component a').addClass('color-light-gray');
					$cat('.page-menu-component a:first').addClass('line-1-left');
					$cat('select').css('color',Colors.blue);
					$cat('.current-folder-tab').css({'background':Colors.cea.orange,'color':Colors.white}).css(cat.line({mode:'top',thickness:5}));
					$cat('.date-panel').html(cat.date());
					
					var applySignature=(cat.printMode!=null && cat.printMode==true)?false:true;
					(applySignature)?cat.signature():$cat(document.body).css('background',Colors.white);
					
					if($cat('.folder-tool').length>0){
						var buttonColor=Colors.gray;
						$cat('.folder-tool').each(function(intIndex){
							var container=$cat('.folder-tools .button-cell')
                                .append('&nbsp;<span class="folder-tool"></span>')
								.find('.folder-tool:last');
							var txt=$cat(this).text();
							cat.txt=txt;
							var src=cat.txt;
							src=(src=='exit')?'exit':src.substring(0,src.indexOf(' ',0));
							src+=(src=='exit')?'.png':'.jpg';
							src=cat.imageDir('thumbnails')+src;
							var thumb='<img src="'+src+'" width="16" height=16" alt="..." />';
							var folderTool='<span class="folder-tool">'+thumb+txt+'</span>';
							container.html(folderTool).addClass('cursor')
                                .click(function(){cat.functionality(txt);})
                                .css(cat.margin({mode:'right'}));
							container.find('.folder-tool')
                                .hover(function(){$cat(this).addClass('color-orange');},
                                       function(){$cat(this).removeClass('color-orange');});
                            container.css(cat.line()).css(cat.pad())
                                .hover(function(){$cat(this).addClass('color-orange');},
								function(){$cat(this).removeClass('color-orange');}).attr('title',txt)
								.find('img').css(cat.pad({thickness:3}))
                                .css(cat.line()).css(cat.margin({mode:'right'}));
							
							$cat(this).remove();
						}).click(function(){cat.functionality($cat(this).text());});
					}
					if(cat.sortField!='' && cat.sortCriteria!=''){
						var field=$cat('.search-bar option[value="'+cat.sortField+'"]').text();
						var criteria="'"+cat.sortCriteria+"'";
						$cat('.page-caption-component span').html('&nbsp;&nbsp;(Search Results for '+field+' matching '+criteria+')');
					}
					$cat('.page-menu-component a').css(cat.line({color:Colors.lighterBlue,mode:'top-right'}));
					if($cat('.current-sort-field').length>0)cat.currentSortfield=$cat('.current-sort-field').val();
					$cat('.page-caption-component span').removeClass('font-weight-normal');
					this.inputTextfields();
					this.dropdownlists();
					this.dateCells();
					if(cat.updatePageCaption)cat.functionality('update page caption');
					if(cat.executeAfterMeow)cat.executeAfterMeowAction();
					this.resetCatGlobals();
					//$cat('.folder-content').height(cat.folderContentHeight+'px');
				},
				dateCells:function(){
					$cat('.date-cell').each(function(){
						var cell=$cat(this), txt=cell.text();
						cell.html('');
						getDatefield(cell,txt);
					});
				},
				dropdownlists:function(){
					$cat('.folder-content select').change(function(){
						var dropdownlist=$cat(this), newListId=this.value;
						if(dropdownlist.is('.countries-list')){
							var stateProvinceCell=$cat('tr:has(.states-provinces-list)').find('td:last');
							stateProvinceCell.find('select').remove();
							cat.data='&country_id='+newListId+'&list_id=';
							cat.feedback=function(feedback){stateProvinceCell.append(feedback).find('select').focus();};
							cat.server('get states and provinces dropdownlist');
						}
					});
				},
				inputTextfields:function(){
					$cat('input:text').change(function(){
						var obj=$cat(this);
						if(obj.is('.alpha-numeric')){
							this.value=cat.strip({string:this.value,characters:cat.characters('alpha_numeric')});
						}
						else if(obj.is('.currency')){
							this.value=cat.strip({string:this.value,characters:cat.characters('numeric')});
							this.value=cat.currency(this.value);
						}
						else if(obj.is('.strictly-numeric')){
							this.value=cat.strip({string:this.value,characters:cat.characters('strictly_numeric')});
						}
					});
				},
				resetCatGlobals:function(){
					cat.extraData='';
					cat.sortField='';
					cat.sortCriteria='';
					cat.profileMode=false;
					cat.profileProperties='';
					cat.editProfileMode=false;
					cat.saveAsNewMode=false;
					cat.saveAsRevisionMode=false;
				}
			};
			core.processor();
		};
		cat.server('meow');
	};//cat.meow() ends here...
	
	//usage example: cat.applyTemplateAsBackground($cat(document.body),'13.png');
	cat.applyTemplateAsBackground=function(container,templateNumberAndExtension){
		container.css('background','url('+cat.imageDir('templates')+'template-'+templateNumberAndExtension+')');
	};//cat.applyTemplateAsBackground() ends here...
	
	/*
		usage example: 
			cat.generateImage({
				container:$cat('.right-panel'),
				src:cat.imageDir(cat.specs.imageFolder)+'1.jpg',
				width:'78%',
				height:'78%',
				thickness:5,
				color:Colors.cea.gray
			});
	*/
	cat.generateImage=function(obj){
		obj.container.html('<img src="'+obj.src+'" />').find('img').width(obj.width).height(obj.height)
			.css(cat.pad({thickness:obj.thickness+2})).css(cat.line({color:obj.color,thickness:obj.thickness}));
	};//cat.generateImage() ends here...
};//cat.tools() ends here...

function executeSearch(){
    	var sortField=$cat('.search-bar select').val();
        var sortCriteria=$cat('.search-bar input:text').val();
    	cat.sortField=sortField;
    	cat.sortCriteria=sortCriteria;
    	if(sortField==''){
    		  alert('Please select search option!');
    		  $cat('.search-bar select').focus();
    	}
    	else if(sortCriteria==''){
    		  alert('Please enter search criteria!');
    		  $cat('.search-bar input:text').focus();
    	}
    	else{
    		  if(cat.applicationId==7)cat.folderTabIndex=0;
              cat.extraData='&sort_field='+cat.sortField+'&sort_criteria='+cat.sortCriteria;
    		  cat.meow(cat.userId,cat.applicationId,cat.folderTabIndex,cat.datasheetTaskIndex);
    	}
};
function fileUpload(){
	if($cat('.file-upload').length>0){
		var formObj=$cat('.file-upload-form');
		if($cat('input:file').val()==''){
			alert('Sorry, file required! Use the BROWSE button to select the file you wish to upload.');
			$cat('input:file').focus();
		}
		else formObj.submit();
	}
};
function getUrlParameters(name){
	name=name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  	var regexS="[\\?&]"+name+"=([^&#]*)", regex=new RegExp(regexS), results=regex.exec(window.location.href);
  	
    return (results==null)?'':results[1];
};
function imposeMaxlength(obj,maxlength){return (obj.value.length <= maxlength);};
function installDocumentKeyup(){
	function keyPressed(e){
		var code=(window.event)?event.keyCode:e.keyCode;
		switch(code){
			case 8: cat.currentKey='Back'; 		 break;
			case 9: cat.currentKey='Tab'; 	 	 break;
			case 13: cat.currentKey='Enter'; 	 break;
			case 16: cat.currentKey='Shift'; 	 break;
			case 17: cat.currentKey='Ctrl'; 	 break;
			case 18: cat.currentKey='Alt'; 		 break;
			case 19: cat.currentKey='Pause'; 	 break;
			case 20: cat.currentKey='Caps Lock'; break;
			case 27: cat.currentKey='Esc'; 		 break;
			case 33: cat.currentKey='Page Up';   break;
			case 34: cat.currentKey='Page Down'; break;
			case 35: cat.currentKey='End'; 		 break;
			case 36: cat.currentKey='Home'; 	 break;
			case 37: cat.currentKey='Left'; 	 break;
			case 38: cat.currentKey='Up'; 		 break;
			case 39: cat.currentKey='Right'; 	 break;
			case 40: cat.currentKey='Down'; 	 break;
			case 45: cat.currentKey='Insert'; 	 break;
			case 46: cat.currentKey='Delete'; 	 break;
			case 48: cat.currentKey=0;   break;
			case 49: cat.currentKey=1;   break;
			case 50: cat.currentKey=2;   break;
			case 51: cat.currentKey=3;   break;
			case 52: cat.currentKey=4;   break;
			case 53: cat.currentKey=5;   break;
			case 54: cat.currentKey=6;   break;
			case 55: cat.currentKey=7;   break;
			case 56: cat.currentKey=8;   break;
			case 57: cat.currentKey=9;   break;
			case 65: cat.currentKey='a'; break;
			case 66: cat.currentKey='b'; break;
			case 67: cat.currentKey='c'; break;
			case 68: cat.currentKey='d'; break;
			case 69: cat.currentKey='e'; break;
			case 70: cat.currentKey='f'; break;
			case 71: cat.currentKey='g'; break;
			case 72: cat.currentKey='h'; break;
			case 73: cat.currentKey='i'; break;
			case 74: cat.currentKey='j'; break;
			case 75: cat.currentKey='k'; break;
			case 76: cat.currentKey='l'; break;
			case 77: cat.currentKey='m'; break;
			case 78: cat.currentKey='n'; break;
			case 79: cat.currentKey='o'; break;
			case 80: cat.currentKey='p'; break;
			case 81: cat.currentKey='q'; break;
			case 82: cat.currentKey='r'; break;
			case 83: cat.currentKey='s'; break;
			case 84: cat.currentKey='t'; break;
			case 85: cat.currentKey='u'; break;
			case 86: cat.currentKey='v'; break;
			case 87: cat.currentKey='w'; break;
			case 88: cat.currentKey='x'; break;
			case 89: cat.currentKey='y'; break;
			case 90: cat.currentKey='z'; break;
			case 91: cat.currentKey='Windows'; 		break;
			case 93: cat.currentKey='Right Click';  break;
			default: cat.currentKey=''; 			break;
		}
		if(cat.currentKey!='' && cat.keypressActionIsAvailable===true)cat.keypressAction();
	};
	document.onkeyup=keyPressed;
};

var Cart={
	 addToCart:function(){
		cat.productIds.push(cat.productId);
		cat.productColors.push(cat.productColor);
		cat.productNames.push(cat.productName);
		cat.categories.push(cat.category);
		cat.categoryIds.push(cat.categoryId);
		if($cat('.quantity-field').length>0)cat.productQuantity=$cat('.quantity-field').val();
		cat.productQuantities.push(cat.productQuantity);
		cat.productPrices.push(cat.productPrice);
		
		cat.extraData=this.getShoppingCartPropertiesForServer();
		Software.meow('Successfully Added To Cart');
	},
	addToServerString:function(field,value){
		if(Cart.mode=='business' || Cart.mode=='shipping'){
			field=(field=='business_name' || field=='shipping_name')?field:Cart.mode+'_'+field;
		}
		cat.data+='&'+field+'='+value;
	},
	applyOnchangeForCartQuantityField:function(textfield,rowIndex){
		//row=$cat(textfield).parent().parent();
		//var productId=row.find('.row-product-id').val();
		//var productCategory=row.find('.row-product-category').val();
		cat.productQuantities[rowIndex]=textfield.value;
/*
		if(cat.productIds.length>0){
			var newQuantity=textfield.value;
			$cat(cat.productIds).each(function(intIndex){
				if(this==productId){
					cat.productQuantities[intIndex]=newQuantity;
					return false;
				}
			});
		}
*/
		var currentTask=($cat('.page-caption').text()=='Shopping Cart Checkout')?'Shopping Cart Checkout':'Shopping Cart';
		cat.extraData=this.getShoppingCartPropertiesForServer();
		Software.meow(currentTask);
	},
	getShoppingCartPropertiesForServer:function(){
		var output='';
		if($cat(cat.productIds).length>0){
			var productIdsString='&product_ids=';
			var productColorsString='&product_colors=';
			var productNamesString='&product_names=';
			var categoriesString='&categories=';
			var categoryIdsString='&category_ids=';
			var productQuantitiesString='&product_quantities=';
			var productPricesString='&product_prices=';
			
			$cat(cat.productIds).each(function(intIndex){
				var separator=(intIndex==0)?'':'~';
				productIdsString+=separator+this;
				productColorsString+=separator+cat.productColors[intIndex];
				productNamesString+=separator+cat.productNames[intIndex];
				categoriesString+=separator+cat.categories[intIndex];
				categoryIdsString+=separator+cat.categoryIds[intIndex];
				productQuantitiesString+=separator+cat.productQuantities[intIndex];
				productPricesString+=separator+cat.productPrices[intIndex];
			});
			
			output=productIdsString+productColorsString+productNamesString+categoriesString;
			output+=categoryIdsString+productQuantitiesString+productPricesString;
		}
		
		return output;
	},
	makeShippingInfoSameAsBillingInfo:function(checkbox){
		function makeDifferent(){
			with($cat('.shipping-form')){
				find('input:text').val('').attr('readonly',false);
				find('input:text').eq(0).focus();
				find('select').attr('disabled',false).find('option[value=""]').attr('selected','selected');
			}
		};
		
		(checkbox.checked)?this.writeShippingAddress():makeDifferent();
	},
	mode:'',
	performValidationOnCartFormFields:function(){
		var container=$cat('.'+this.mode+'-form');
		var fields=container.find('.cart-fields').val().split('^');
		var itsOkayToProceed=true;
		
		$cat(fields).each(function(){
			var field=this;
			var row=container.find('.field[value="'+this+'"]').parent().parent();
			var caption=row.find('td:first').text();
			caption=caption.substring(0,caption.length-1);
			
			if(row.find('input:text').length>0){
				var isExcludedFromValidation=(this=='address_two')?true:false;
				var value=row.find('input:text').val();
				
				if(value=='' && !isExcludedFromValidation){
					alert('Sorry, '+caption+' required!');
					row.find('input:text').focus();
					itsOkayToProceed=false;
					
					return false;
				}
				else Cart.addToServerString(field,value);
			}
			else if(row.find('select').length>0){
				var value=row.find('select').val();
				if(value==''){
					alert('Sorry, '+caption+' required!');
					row.find('select').focus();
					itsOkayToProceed=false;
					
					return false;
				}
				else Cart.addToServerString(field,value);
			}
			else if(row.find('input:password').length>0){
				var value=row.find('input:password').val();
				if(value==''){
					alert('Sorry, '+caption+' required!');
					row.find('input:password').focus();
					itsOkayToProceed=false;
					
					return false;
				}
				else Cart.addToServerString(field,value);
			}
			else{
				var value=row.find('td:last').find('input:hidden').val();
				Cart.addToServerString(field,value);
			} 
		});
		
		return itsOkayToProceed;
	},
	placeOrder:function(){
		cat.extraData=this.getShoppingCartPropertiesForServer();
		if($cat('.shipping-rate').length>0)
			cat.extraData+='&shipping_rate='+cat.strip({string:$cat('.shipping-rate').text(),characters:cat.characters('numeric')});
		if($cat('.order-total').length>0)
			cat.extraData+='&order_total='+cat.strip({string:$cat('.order-total').text(),characters:cat.characters('numeric')});
		Software.meow('THANK YOU for shopping with Us!');
	},
	removeFromCart:function(intIndex,obj){
		$cat(obj).parent().parent().remove();
		this.updateProductQuantitiesAndPrices();
		cat.extraData=this.getShoppingCartPropertiesForServer();
		Software.meow('Successfully Removed From Cart');
	},
	resetCartArrays:function(){
		cat.productIds=[];
		cat.productColors=[];
		cat.productNames=[];
		cat.categories=[];
		cat.categoryIds=[];
		cat.productQuantities=[];
		cat.productPrices=[];
	},
	retrievePassword:function(mode){
		cat.extraData=($cat('.cart-signin-sheet').length>0)?'&back_to_signin_sheet=true&retrieve_password_for='+mode:'';
		Software.meow('Password Retrieval');
	},
	setCartProperties:function(){
		this.resetCartArrays();
		cat.productId='';
		cat.productColor='';
		cat.productName='';
		cat.category='';
		cat.categoryId='';
		cat.productQuantity=1;
		cat.productPrice=0;
		
		cat.wholesaleId='';
		cat.wholesaleMode=false;
	},
	signIn:function(mode){
		if($cat('.email-address input:text').val()==''){
			alert('Sorry, EMAIL ADDRESS is required!');
			$cat('.email-address input:text').focus();
		}
		else if($cat('.password input:password').length>0 && $cat('.password input:password').val()==''){
			alert('Sorry, PASSWORD is required!');
			$cat('.password input:password').focus();
		}
		else{
			cat.extraData='&email_address='+$cat('.email-address input:text').val();
			if($cat('.retrieve-password-for').length>0)
				cat.extraData+='&retrieve_password_for='+$cat('.retrieve-password-for').val();
			if($cat('.page-caption').text()=='Password Retrieval'){
				cat.data=cat.extraData;
				cat.feedback=function(feedback){
					$cat('.page-body').html(feedback);
					new Timer({processor:function(){
						cat.extraData+=Cart.getShoppingCartPropertiesForServer();
						Software.meow('Shopping Cart Checkout');
					}}).timeout(cat.fadeTime);
				};
				cat.server(mode);
			}
			else{
				cat.extraData+='&authenticate_credentials=true&signin_mode_from_client='+mode;
				cat.extraData+='&password='+$cat('.password input:password').val();
				if(mode=='admin-control-panel')Admin.authenticate();
				else{
					cat.extraData+=this.getShoppingCartPropertiesForServer();
					Software.meow('Shopping Cart Checkout');
				}
			}
		}
	},
	submitCartForm:function(mode){
		if($cat('.cart-fields').length>0){
			this.mode=mode;
			cat.data='';
			if(this.mode=='shipping'){
				this.mode='billing';
				var itsOkayToProceed=this.performValidationOnCartFormFields();
				if(itsOkayToProceed){
					this.mode='shipping';
					itsOkayToProceed=this.performValidationOnCartFormFields();
				}
			}
			else var itsOkayToProceed=this.performValidationOnCartFormFields();
			
			if(itsOkayToProceed){
				var savingBusinessInfo=($cat('tr:contains("Business Name:")').length>0)?true:false;
				var updateModes=(savingBusinessInfo)?'business':'billing~shipping';
				cat.extraData=cat.data+'&update_profile=true&update_modes='+updateModes;
				if($cat('.same-as-billing input:checkbox').length>0){
					var sameAsBilling=($cat('.same-as-billing input:checkbox').attr('checked')==true)?1:0;
					cat.extraData+='&same_as_billing='+sameAsBilling;
				}
				cat.extraData+=this.getShoppingCartPropertiesForServer();
				if(savingBusinessInfo)cat.extraData+='&wholesale_id='+cat.wholesaleId;
				Software.meow('Shopping Cart Checkout');
			}
		}
	},
	updateProductQuantitiesAndPrices:function(){
		if($cat('.shopping-cart').length>0){
			this.resetCartArrays();
			var prefix='row-product-';
			var classnames=['id','color','name','category','category-id','quantity','price'];
			
			$cat('.item-number').each(function(){
				var cell=$cat(this);
				cat.productIds.push(cell.find('.'+prefix+classnames[0]).val());
				cat.productColors.push(cell.find('.'+prefix+classnames[1]).val());
				cat.productNames.push(cell.find('.'+prefix+classnames[2]).val());
				cat.categories.push(cell.find('.'+prefix+classnames[3]).val());
				cat.categoryIds.push(cell.find('.'+prefix+classnames[4]).val());
				cat.productQuantities.push(cell.find('.'+prefix+classnames[5]).val());
				cat.productPrices.push(cell.find('.'+prefix+classnames[6]).val());
			});
		}
	},
	writeShippingAddress:function(){
		this.writeShippingName();
		$cat(['One','Two']).each(function(){
			var mode='Address '+this;
			var txt=$cat('.billing-form tr:contains("'+mode+':")').find('input:text').val();
			$cat('.shipping-form tr:contains("Shipping '+mode+':")').find('input:text').val(txt);
		});
		$cat(['City','Postal Code']).each(function(){
			var mode=this;
			var txt=$cat('.billing-form tr:contains("'+mode+':")').find('input:text').val();
			$cat('.shipping-form tr:contains("'+mode+':")').find('input:text').val(txt);
		});
		var txt=$cat('.billing-form select').val();
		$cat('.shipping-form select').find('option[value="'+txt+'"]').attr('selected',true);
		$cat('.shipping-form input:text').attr('readonly',true);
		$cat('.shipping-form select').attr('disabled',true);
	},
	writeShippingAddressIfApplicable:function(){
		if($cat('.shipping-form .same-as-billing').length>0){
			if($cat('.shipping-form .same-as-billing').find('input:checkbox').attr('checked')==true)this.writeShippingAddress();	
		}
	},
	writeShippingName:function(){
		var firstName=$cat('.billing-form tr:contains("First Name:")').find('input:text').val();
		var lastName=$cat('.billing-form tr:contains("Last Name:")').find('input:text').val();
		$cat('.shipping-form tr:contains("Shipping Name:")').find('input:text').val(firstName+' '+lastName);
	}
};
var Newsletter={
	addToServerString:function(field,value){cat.data+='&'+field+'='+value;},
	performValidationOnFormFields:function(){
		var container=$cat('.newsletter-signup-form');
		var fields=container.find('.newsletter-fields').val().split('^');
		var itsOkayToProceed=true;
		
		$cat(fields).each(function(){
			var field=this;
			var row=container.find('.field[value="'+this+'"]').parent().parent();
			var caption=row.find('td:first').text();
			caption=caption.substring(0,caption.length-1);
			var value=row.find('input:text').val();
			
			if(value==''){
				alert('Sorry, '+caption+' required!');
				row.find('input:text').focus();
				itsOkayToProceed=false;
				
				return false;
			}
			else Newsletter.addToServerString(field,value);
		});
		
		return itsOkayToProceed;
	},
	submitForm:function(){
		if($cat('.newsletter-fields').length>0){
			cat.data='';
			var itsOkayToProceed=this.performValidationOnFormFields();
			if(itsOkayToProceed){
				cat.extraData=cat.data;
				cat.task='Newsletter Sign Up Form Successfully Submitted!';
				Software.meow();
			}
		}
	}
};//Newsletter ends here...

installDocumentKeyup();

