/**
*
* $Id: core.js,v 1.11 2010/03/09 12:53:31 tleen Exp $
*
* Application-wide javascript
*
**/

var DATA_COLUMN_SEPERATOR   = '|';
var DATA_ROW_SEPERATOR      = '^^';
var DATA_META_START         = '[';
var DATA_META_END           = ']';
var DATA_META_SEPERATOR     = ':';

String.prototype.head = function(seperator){ return this.split(seperator).first(); };
String.prototype.tail = function(seperator){ return this.split(seperator).pop(); };
Element.addMethods({
  log 						: function(element){ console.log(element); return element; },
	appendChild			: function(element,child){ element.insert({ bottom : child}); return element; },
	removeChildren 	: function(element){ element.childElements().invoke('remove'); return element; },
	depairClassName : function(element, target){ 
		var str =  $w(element.className).grep('^' + target + '_').first();
		return (str ? str.tail('_') : ''); 
	}
});

/**
* Ajax assist
**/

function ajax_parse(raw){
    
    var returner = $H({});      

    data = raw.split(DATA_ROW_SEPERATOR);
		data = data.select(function(element){ return (element != ''); });	

    var rows = new Array();       
		data.each(function(line){
        if(line.startsWith(DATA_META_START)){
            var_data = line.substring(1,line.length);
            var_data = var_data.split(DATA_META_SEPERATOR);
            returner[var_data[0]] = var_data[1];    
        }else{ 
            cells   = line.split(DATA_COLUMN_SEPERATOR);
            rows.push(cells);
        }        
    });

    returner['rows'] = rows; 
    return returner;
}

function table_clear(id){
    table_body = $(id).select('tbody').first();
   	if(table_body) table_body.remove();
}

function table_load(id,rows){
    table_clear(id);
    var body = '';
    if(rows){
			for(var i = 0; i < rows.length; i++) body = (body + '<tr><td>' + rows[i].join('</td><td>') + '</td></tr>');
    }
		$(id).insert({top : '<tbody>' + body + '</tbody>'});
}

function is_false(item){
    return ( (typeof item == "undefined") || (!item) || (item == '0') || (item.size && (item.size() == 0) ));
}

function is_true(item){
    return !is_false(item);
}

function return_false(){
    return false;
}

function return_true(){
    return true;
}

/**
*
* Generitable 
*
*/

function generitable_parse(raw){ return ajax_parse(raw); }

/**
* Scan through the table headers, disable all header images visibility besides id
**/
function generitable_sort(table,id){

	$(table).select('thead tr th img').each(function(image){
		((image.identify() == id) ? image.show() : image.hide());
    });
}

function generitable_update(id,data){

	data = generitable_parse(data);
	table_load(id,data['rows']);

	$(id).select('tbody tr').partition(function(e,i){ return ((i % 2) == 0) })[1].invoke('addClassName','alt');
	$(id).select('tbody tr td:last-child').invoke('writeAttribute',{'colspan' : '2'}); //control column

  if(data['range']) $(id + '_range').update(data['range']);
	
	$A(['more','less']).each(function(modifier){
  	var image = $(id + '_' + modifier);
   	if(data[modifier]){
			image.writeAttribute({
				'url' 			: data[modifier],
				'generitable'	: id});

			image.stopObserving();
			image.observe('click',function(element){
				generitable_update_url(this.readAttribute('generitable'),this.readAttribute('url'));
			}.bindAsEventListener(image));
            
			image.show();
   	}else{
			image.hide();
		}
  });
}

function generitable_update_url(id,url){
	new Ajax.Request(
   		url,{
       	onSuccess: function(request){ generitable_update(id,request.responseText); } });
}

document.observe('dom:loaded',function(){



	$$('a.dummy').each(function(element){ element.writeAttribute({'href' : 'javascript:void(0)'}) });
	$$('form.dummy').each(function(form){ form.writeAttribute({'action' : 'javascript:void(0)'}); });

	$$('form .autosubmit').each(function(element){
		element.observe('change',function(event){
			Event.element(event).form.submit();
		});
	});

	Ajax.Responders.register({
		onCreate: function(){ $('indicator').show() },
		onComplete : function(){
			if(!Ajax.activeRequestCount) $('indicator').hide();		
	}});

	$$('.toggle').each(function(element){
		element.observe('click',function(event){
			$(this.depairClassName('target')).toggle();
		}.bindAsEventListener(element));
	});	

	function toggle_custom_element(element){

			var trigger = $(element.depairClassName('trigger'));
			var target = $(element.depairClassName('target'));
			
			(element.getValue().toLowerCase().include(trigger) ? target.show() : target.hide());
	}



	$$('form .toggle_custom').each(function(element){
		element.observe('change',function(element){ 
			var target = $(this.depairClassName('target'));
			(this.getValue().toLowerCase().include(this.depairClassName('trigger')) ? target.show() : target.hide().value = '');
		}.bindAsEventListener(element));
	
		var target = $(element.depairClassName('target'));
		(element.getValue().toLowerCase().include(element.depairClassName('trigger')) ? target.show() : target.hide().value = '');

	});

	$$('.less').each(function(element){
		var target = $(element.depairClassName('target'));
		element.observe('click',function(event){
			event.target.update( (this.select('.lessable').invoke('toggle').first().visible() ? 'Less...' : 'More...'));
		}.bindAsEventListener(target));

		if(!target.select('.lessable').invoke('hide').length) element.hide();
	});

    if($('menu_admin')) $('menu_admin').observe('change',function(event){
        var url = $F(event.element());
        if(url) window.location = url;
    });


	$$('input.calendar').each(function(element){
		new Control.DatePicker(element, {
			timePicker 					: element.hasClassName('time'),
			timePickerAdjacent 	: true,	
			dateFormat					: dateFormat,
			dateTimeFormat			: dateTimeFormat
		});
	});

	$$('form input.upload').each(function(element){	
		element.up('form').writeAttribute('enctype','multipart/form-data');
	});

	$$('div#action span.error').invoke('appear');

	$$('form .variable').each(function(element){
		element.observe(element.depairClassName('on'),function(event){
		  var variable = element.depairClassName('name');
			if(variable){
				var hidden = element.up('form').getInputs('hidden',variable);	
				if(hidden.first()) hidden.first().value = element.depairClassName('value');
				else element.up('form').insert({top : new Element('input',{type : 'hidden', name : variable, value : element.depairClassName('value')})});
			}
		});	
	});


	if(document['generitables']){
		var generitables = $H(document['generitables']);	
		generitables.keys().each(function(x){ 
			generitable_update_url(x,generitables.get(x));
		});		
	}

	if($('interstitial')){
		
		var time = $w($('interstitial').className).grep('^time_').first().tail('_');
		$R(0,time*2).each(function(i){ $('interstitial').appendChild(new Element('div')) });
		new PeriodicalExecuter(function(pe) {
			var divs = $$('div#interstitial div');
			divs.invoke('removeClassName','highlight');
			divs[pe.counter%divs.length].addClassName('highlight');
			pe.counter++;
		},0.5)['counter'] = 0;
	}

	if($('imagelist')){
		Sortable.create('imagelist',{
			constraint:	false,
			onUpdate: function(list){
				new Ajax.Request(url_data,{
					parameters: Sortable.serialize(list) + '&do=reorder&id=' + list.depairClassName('id')
				})
			}
		});

		$$('ul#imagelist a.icon').each(function(anchor){
			anchor.observe('click',function(event){
				new Ajax.Request(url_data,{
					parameters: 'do=delete&id=' + this.up('li').depairClassName('file'),
					onSuccess: 	function(){
						new Effect.DropOut(this.up('li'));
					}.bind(this)
				})
			}.bindAsEventListener(anchor));
		});
	}



	if($$('ul.slides')){
		var slides = $$('ul.slides li');
		slides['current_slide'] = 0;

		var slides_shift = (function(distance){
			new Effect.DropOut(this[this.current_slide],{duration : 2});
			this.current_slide = ((this.current_slide + span)%this.size());
			new Effect.Appear(this[this.current_slide],{duration : 2, delay: 2});
		}).bind(slides);

		$$('ul.slides div.control a').each(function(element){
			element.observe('click',function(event){
				var distance = ((event.target.depairClassName('shift') == 'next') ? 1 : -1);
				
				var next = (this.current_slide + distance);
				if(next < 0) next = slides.length - 1;
				next = (next%this.size());

				new Effect.DropOut(this[this.current_slide],{duration : 1});
				this.current_slide = next;
				new Effect.Appear(this[this.current_slide],{duration : 1, delay: 1});

			}.bindAsEventListener(this));
		}.bindAsEventListener(slides));
	}

	$$('form input.numeric').each(function(element){
		element.observe('change',function(){
			this.value = $A($F(this)).select(function(x){ return $R('0','9').include(x); }).join('');
		}.bindAsEventListener(element))
	});

	$$('ul#previews li a').each(function(preview){
		preview.observe('click',function(){

			$$('ul#previews li').invoke('removeClassName','highlighted');
			this.up('li').addClassName('highlighted');
			new Effect.Fade('main',{
				afterFinish: function(){ 
					$('main').writeAttribute({src : this.readAttribute('src')});
					new Effect.Appear('main',{direction:	'bottom-left'});
				}.bind(this)
			})
		}.bindAsEventListener(preview));
	});


	$$('table#cart input.quantity').each(function(element){
		element.observe('change',function(){ 
			if($('checkout')) $('checkout').remove(); 
			new Effect.Pulsate('update');
		});
	});

  if($('code')) $('code').observe('change',function(){ new Effect.Pulsate('apply'); });

	if($('defer')){
		$('defer').observe('change',function(event){
			(this.checked ? new Effect.BlindUp('billing_info') : new Effect.BlindDown('billing_info'));
			if(this.checked){
				$('clone_shipping').disable();
				if(!$('shipping_info').visible()){
					$('clone_shipping').checked = false;
					$('shipping_info').select('.disableable').invoke('enable').invoke('clear');
					new Effect.BlindDown('shipping_info');
				}
			}else{	
				$('billing_info').select('.disableable').invoke((this.checked ? 'disable' : 'enable')).invoke('clear');
				$('clone_shipping').enable();
				if(!$('shipping_info').visible()){
					$('clone_shipping').checked = false;
					new Effect.BlindDown('shipping_info');
				}
			}
		});

		if($('defer').checked){
			$('billing_info').hide().select('.disableable').invoke((this.checked ? 'disable' : 'enable')).invoke('clear');
			$('clone_shipping').disable();
		}
	}

	if($('clone_shipping')){

		$('billing_country_id').observe('change',function(event){
			if($F('billing_country_id') && ($('shipping_country_id').select('option').pluck('value').indexOf($F('billing_country_id')) < 0)){
				new Effect.BlindDown('shipping_info');
				$('clone_shipping').checked = false;
				alert('You may not ship to this address');
			}
		});

		$('clone_shipping').observe('change',function(event){
		
			if($('clone_shipping')){
				if(($('shipping_country_id').select('option').pluck('value').indexOf($F('billing_country_id'))) < 0){
					alert('Cannot ship to your billing country');
					$('clone_shipping').checked = false;
					return;
				}
			}

			$('shipping_info').select('.disableable').invoke((this.checked ? 'disable' : 'enable')).invoke('clear');
			(this.checked ? new Effect.BlindUp('shipping_info') : new Effect.BlindDown('shipping_info'));
		}.bindAsEventListener($('clone_shipping')));

		if($('clone_shipping').checked) $('shipping_info').hide().select('.disableable').invoke('disable').invoke('clear');
	}

	$$('a.captcha').each(function(element){
		element.observe('click',function(event){
			var target = $(this.depairClassName('target'));	
			target.src = (target.src + '/rand/' + Math.random());
		}.bindAsEventListener(element));
	});

});


