/*
Script: Click2Call.js
	Contains <Click2Call>

Author:
	Alan Roemen

Class: Click2Call
	A javascript to display a callme box

Options:
	baseURL: Base directory for script. Default: false
	scriptName: Name of javascript file. Default: 'slidingtabs'
	classFile: CSS template file. Set to false to use only the default. Default: false
	classUseBase: Set to false to use a style sheet outside the main root template directory. Default: true
	draggable: Makes containers draggable if true. Default: true
	backgroundClose: Limits to 1 active container and closes container when clicking outside container. Default: true
	cookieExpire: Number of days before the cookie will expire. Default: 7
*/

var Click2Call = new Class({
	options: {
		baseURL: false,
		scriptName: 'click2call',
		classFile: false,
		classUseBase: true,
		draggable: true,
		backgroundClose: false,
		cookieExpire: 7,
                slide: false
	},	

	initialize: function(links, options) {
		this.active = false;
		this.storeHide = false;
		this.setOptions(options);
		this.site = (location.href.indexOf('#')!=-1?location.href.substring(0, location.href.lastIndexOf('#')):location.href);

		// Collect Links
		if(links) this.links = document.getElements('a[rel='+links+']');
		else this.links = document.getElements('a[rel=click2call]');

		// Get script base path
		if(!this.options.baseURL) {
			var elements = document.getElementsByTagName('script');
			for (var i=0; i<elements.length; i++) {
				if (elements[i].src && (elements[i].src.indexOf(this.options.scriptName+'.js') != -1)) {
					var src = elements[i].src;
					this.options.baseURL = src.substring(0, src.lastIndexOf('/'));
					break;
				}
			}
			// Get document base path
			this.documentBasePath = document.location.href;
			if (this.documentBasePath.indexOf('?') != -1)
				this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.indexOf('?'));
			this.documentBasePath = this.documentBasePath.substring(0, this.documentBasePath.lastIndexOf('/'));
			if (this.options.baseURL.indexOf('://') == -1 && this.options.baseURL.charAt(0) != '/')
				this.options.baseURL = this.documentBasePath + "/" + this.options.baseURL;
		}

		// Get Config
		new Ajax(this.options.baseURL+'/'+this.options.scriptName+'.php', {
			method: 'get',
			data: 'site='+this.site+'&get=config',
			onComplete: function(response){ if(response != '') { this.config = Json.evaluate(response); this.start(); } }.bind(this)
		}).request();
	},

	start: function(){
		// Add Event to Links
		this.links.each(function(el,i){
			el.addEvent('click', function(e){
				e = new Event(e).stop();
				if(this.active) return;
				this.display();
			}.bindWithEvent(this));
		}.bind(this));

		// IE6 fixed positioning & positioning hack
		this.ieFixed = false;
		if(window.ie6){
			new Ajax(this.options.baseURL+'/ie-fixed.js', {
				method: 'get',
				onComplete: function(response){ this.ieFixed = response; }.bind(this)
			}).request();
		}

		// Stylesheet(s)
		new Asset.css(this.options.baseURL + '/' + this.options.scriptName + '.css', {id: 'c2c_style'});
		if(this.options.classFile!==false && this.options.classUseBase)
			new Asset.css(this.options.baseURL + '/templates/' + this.options.classFile + '.css', {id: 'style'});
		else if(this.options.classFile!==false) new Asset.css(this.options.classFile, {id: 'style'});

		// Load & Set Cookie Values
		this.shown = Cookie.get(this.config.cookie_name + '_shown');
		if(this.shown === false){
			this.shown = 'false';
			this.setCookie(this.config.cookie_name + '_shown', this.shown, { duration: this.options.cookieExpire });
		}
		this.cookie = Cookie.get(this.config.cookie_name);
		if(!this.cookie)
			this.cookie = new Hash(this.config);
		else this.cookie = new Hash(Json.evaluate(this.cookie));
		this.cookie.set('time', this.config.time);
		if(!this.cookie.get('time_start')) this.cookie.set('time_start', this.config.time);

		if(this.shown == 'false'){
			this.saveLink = true;
			this.config.exclude.each(function(e){
				e = e.toLowerCase();
				if(this.site.indexOf(e) != -1) this.saveLink = false;
			}.bind(this));
			if(this.saveLink){
				if(!this.cookie.get('links')) this.cookie.set('links', new Array(this.site));
				else if(this.cookie.get('links').indexOf(this.site)==-1) this.cookie.get('links').push(this.site);
			}
		}
		this.setCookie(this.config.cookie_name, this.cookie);

		// Execute config options
		if(this.shown == 'true') return;
		if(this.cookie.get('links') && $type(this.cookie.get('links')) == 'array')
			if(this.cookie.get('max_clicks')!=0 &&
				 this.cookie.get('links').length>=this.cookie.get('max_clicks')) { this.storeHide=true; if(this.options.slide==true){this.display_slide();}else{this.display();} }
		if(this.cookie.get('max_wait')!=0 && 
			 this.cookie.get('max_wait')<=(this.cookie.get('time') - this.cookie.get('time_start'))) { this.storeHide=true; if(this.options.slide==true){this.display_slide();}else{this.display();} }
	},

	display: function(){
		this.active = true;
		
		// Create Element
		this.background = new Element('div', {
			'class': this.options.scriptName + '_background',
			'styles': {
				'opacity': '0.7'
			}
		}).inject(document.body);
		this.container = new Element('div', {
			'class': this.options.scriptName + '_container',
			'styles': {
				'cursor': (this.options.backgroundClose?'pointer':'auto')
			},
			'events': {
				'click': (function(){
					if(this.options.backgroundClose) this.hide();
				}).bindWithEvent(this)
			}
		}).inject(document.body);
		this.content = new Element('div', {'class': this.options.scriptName});//.inject(this.container);
		if(this.ieFixed) eval(this.ieFixed);

		// Create Content
		this.field = new Array();
		this.header = new Element('div', {'class': 'header'}).injectInside(this.content);
		this.message = new Element('div', {'class': 'message'}).injectInside(this.content);
		// First Name
		this.field[0] = new Element('div', {'class': 'field'}).setHTML('<br />').injectInside(this.content);
		this.first_name = new Element('input', {'type': 'text', 'value': this.config.first_name}).injectInside(this.field[0]);
		this.first_name_label = new Element('label', {'for': 'First Name'}).setHTML('First Name:').injectTop(this.field[0]);
		// Last Name
		this.field[1] = new Element('div', {'class': 'field'}).setHTML('<br />').injectInside(this.content);
		this.last_name = new Element('input', {'type': 'text', 'value': this.config.last_name}).injectInside(this.field[1]);
		this.last_name_label = new Element('label', {'for': 'Last Name'}).setHTML('Last Name:').injectTop(this.field[1]);
		// Phone Number
		this.field[2] = new Element('div', {'class': 'field'}).setHTML('<br />').injectInside(this.content);
		this.phone_number = new Element('input', {'type': 'text'}).injectInside(this.field[2]);
		this.phone_number_label = new Element('label', {'for': 'Phone Number'}).setHTML('Phone Number:').injectTop(this.field[2]);
		// Buttons
		this.field[3] = new Element('div', {'class': 'field'}).setHTML('<br />').injectInside(this.content);
		this.buttonSave = new Element('img', {
			'src': this.options.baseURL + '/button_callme.gif',
			'class': 'button',
			'events': {
				'click': (function(){ this.callMe(); }).bindWithEvent(this)
			}
		}).injectInside(this.field[3]);
		this.buttonCancel = new Element('img', {
			'src': this.options.baseURL + '/button_cancel.gif',
			'class': 'button',
			'events': {
				'click': (function(){ this.hide(); }).bindWithEvent(this)
			}
		}).injectInside(this.field[3]);
		new Element('br', {'styles': {'clear': 'both'}}).injectInside(this.content);

		// Get Message
		new Ajax(this.options.baseURL+'/'+this.options.scriptName+'.php', {
			method: 'get',
			data: 'dk='+this.cookie.get('domain_key')+'&get=data',
			onComplete: function(response){
				if(response=='') { alert('Error 110: Unable to load'); this.hide(); return; }
				response = Json.evaluate(response);
				this.msg_id = response.msg_id;
				this.message.setHTML(response.message);
				this.thankyou = response.thankyou;
				this.content.injectInside(this.container);
				if(this.config.first_name == '') this.first_name.focus();
				else if(this.config.last_name == '') this.last_name.focus();
				else this.phone_number.focus();
			}.bind(this)
		}).request();
	},
    display_slide: function(){
                if(this.config.first_name == '') this.config.first_name = 'First Name';
                if(this.config.last_name == '') this.config.last_name = 'Last Name';
		this.active = true;

                // Create Element
                if(this.config.afterhours=='true'){
                    this.content = new Element('div', {'id': 'c2cah',
                            'styles':{
                                    'right':'113px',
                                    'bottom':'0px',
                                    'opacity': '1',
                                    'position':'fixed',
                                    'z-index':'9999'
                            }
                        });
                     this.content.height = 235;
                }else{
                    this.content = new Element('div', {'id': 'c2c',
                            'styles':{
                                    'right':'113px',
                                    'bottom':'0px',
                                    'opacity': '1',
                                    'position':'fixed',
                                    'z-index':'9999'
                            }
                        });
                        this.content.height = 150;
                }
                    


                if(this.ieFixed) eval(this.ieFixed);
		// Create Content
		this.header = new Element('a', {'href':'',
                                                'title':'Close Window',
                                                'events': {
                                                    'click': (function(e){e = new Event(e).stop();this.hide_slide();}).bindWithEvent(this)
                                                }
                                               }).setHTML('<span></span>').injectInside(this.content);
                // Message
                if(this.config.afterhours=='true') this.message = new Element('div', {'class': 'message'}).injectInside(this.content);

                // First Name
		this.first_name = new Element('input', 
                                             {'type': 'text',
                                              'class': 'fname',
                                              'value': this.config.first_name,
                                              'events':{
                                                  'click': (function(){if(this.first_name.value=='First Name'){this.first_name.value='';}}).bindWithEvent(this),
                                                  'blur': (function(){if(this.first_name.value==''){this.first_name.value = 'First Name';}}).bindWithEvent(this)
                                              }
         
                                              }).injectInside(this.content);
		this.last_name = new Element('input', 
                                            {'type': 'text',
                                             'class': 'lname',                                             
                                             'value': this.config.last_name,
                                             'events':{
                                                  'click': (function(){if(this.last_name.value=='Last Name'){this.last_name.value='';}}).bindWithEvent(this),
                                                  'blur': (function(){if(this.last_name.value==''){this.last_name.value = 'Last Name';}}).bindWithEvent(this)
                                              }
                                            }).injectInside(this.content);
		// Phone Number
		this.phone_number = new Element('input',
                                            {'type': 'text',
                                             'class': 'pnumber',                       
                                             'value': 'Phone Number',
                                             'events':{
                                                  'click': (function(){if(this.phone_number.value=='Phone Number'){this.phone_number.value='';}}).bindWithEvent(this),
                                                  'blur': (function(){if(this.phone_number.value==''){this.phone_number.value = 'Phone Number';}}).bindWithEvent(this)
                                              }
                                            }).injectInside(this.content);
		// Buttons
		this.buttonSave = new Element('input',
                                             {'type':'submit',
                                              'value': '',
                                              'events': {
                                                        'click': (function(){ this.callMe2(); }).bindWithEvent(this)
                                                        }
		}).injectInside(this.content);
		
		//new Element('br', {'styles': {'clear': 'both'}}).injectInside(this.content);

		// Get Message
		new Ajax(this.options.baseURL+'/'+this.options.scriptName+'.php', {
			method: 'get',
			data: 'dk='+this.cookie.get('domain_key')+'&get=data',
			onComplete: function(response){
				if(response=='') { alert('Error 110: Unable to load'); this.hide_slide(); return; }
				response = Json.evaluate(response);                                
				this.msg_id = response.msg_id;
                                if(this.config.afterhours == 'true') this.message.setHTML('Requests made before or after regular hours will be contacted the following business day.<div style="padding-top:4px">Business Hours:<br /> Mon - Fri, 8-4:30 pm (CT) </div>');
				this.thankyou = response.thankyou;
				this.content.injectInside(document.body);
			}.bind(this)
		}).request();

                if(this.config.afterhours=='true'){
                    this.fx = new Fx.Style(this.content, 'bottom', {duration:2500});
                    this.fx.start(-this.content.height,0);
                    
                }else{
                    this.fx = new Fx.Style(this.content, 'bottom', {duration:2000});
                    this.fx.start(-this.content.height,0);
                    
                }

                

	},

	callMe: function(){
		// Remove old errors
		$$('.'+this.options.scriptName+' .error').each(function(el){el.remove();});

		// Check for errors
		if(!this.validateForm()) return;

		// Process form and show thank you
		this.field.each(function(el,i){el.remove();});
		var thankyou = new Element('div', {'class': 'thankyou'}).setHTML(this.thankyou).injectAfter(this.message);
		var field = new Element('div', {'class': 'field'}).setHTML('<br />').injectAfter(thankyou);
		new Element('img', {
			'src': this.options.baseURL + '/button_close.gif',
			'class': 'button',
			'events': {
				'click': (function(){ this.hide(); }).bindWithEvent(this)
			}
		}).injectInside(field);

		// Store callme in DB
		var contact_info = 'First Name: '+this.first_name.value+'\n'
										 + 'Last Name: '+this.last_name.value+'\n'
										 + 'Phone Number: '+this.phone_number.value;
		new Ajax(this.options.baseURL+'/'+this.options.scriptName+'.php', {
			method: 'post',
			data: 'response=call&email='+this.config.domain_key+'&msg_id='+this.msg_id+'&contact_info='+contact_info+'&first_name='+this.first_name.value+'&last_name='+this.last_name.value+'&phone_number='+this.phone_number.value
		}).request();
	},
        callMe2: function(){
          if(!this.validate2()) return;

          var contact_info= 'First Name: ' + this.first_name.value+'\n'
                          + 'Last Name: ' + this.last_name.value+'\n'
                          + 'Phone Number: '+this.phone_number.value;
          new Ajax(this.options.baseURL+'/'+this.options.scriptName+'.php', {
                    method: 'post',
                    data:'response=call&email='+this.config.domain_key+'&msg_id='+this.msg_id+'&contact_info='+contact_info+'&first_name='+this.first_name.value+'&last_name='+this.last_name.value+'&phone_number='+this.phone_number.value
          }).request();

          this.close2();
          
        },
        close2: function(){
          this.cookie.set('links', []);
	  this.setCookie(this.config.cookie_name, this.cookie);
	  this.setCookie(this.config.cookie_name + '_shown', true, { duration: this.options.cookieExpire });
          
          this.tyfx = new Fx.Style(this.content, 'opacity', {duration:1000});
          this.tyfx.start(1.0,0.0).chain(function(){
              this.first_name.remove();
              this.last_name.remove();
              this.phone_number.remove();
              this.buttonSave.remove();
              this.content.setProperty('id', 'c2cty');
              this.content.height = 162;


              if(this.config.afterhours=='true'){
                  this.message.setHTML(this.thankyou);
                      this.tyfx.start(0.0,1.0);
                  
              }else{
                  this.message = new Element('div', {'class': 'message'}).injectInside(this.content);
                  this.message.setHTML(this.thankyou);
                      this.tyfx.start(0.0,1.0);
                  
              }
              
          }.bind(this));



        },

        validate2: function(){
            var v = true;

            //set style color back to normal
            this.first_name.setStyle('color','black');
            this.last_name.setStyle('color','black');
            this.phone_number.setStyle('color','black');


            this.first_name.value = this.first_name.value.replace(/^\s+|\s+$/g,"");
	    this.last_name.value = this.last_name.value.replace(/^\s+|\s+$/g,"");
	    this.phone_number.value = this.phone_number.value.replace(/^\s+|\s+$/g,"");
            var numeric_phone = this.phone_number.value.replace(/[^0-9]/g,"");

            if(this.first_name.value=='First Name'){v = false; this.first_name.setStyle('color', 'red');}
            if(this.last_name.value=='Last Name'){v=false; this.last_name.setStyle('color', 'red');}
            if(this.phone_number.value=='Phone Number'){v = false; this.phone_number.setStyle('color', 'red');}
            if(numeric_phone.length < 10) {v = false; this.phone_number.setStyle('color', 'red'); this.phone_number.setProperty('value','Phone Number')}
            return v;
        },

	validateForm: function(){
		var r = true;
		this.first_name.value		= this.first_name.value.replace(/^\s+|\s+$/g,"");
		this.last_name.value		= this.last_name.value.replace(/^\s+|\s+$/g,"");
		this.phone_number.value	= this.phone_number.value.replace(/^\s+|\s+$/g,"");
		var numeric_phone = this.phone_number.value.replace(/[^0-9]/g,"");
		if(this.first_name.value == '') { r = false; this.showError(this.first_name_label, '(missing)'); }
		if(this.last_name.value == '') { r = false; this.showError(this.last_name_label, '(missing)'); }
		if(this.phone_number.value == '') { r = false; this.showError(this.phone_number_label, '(missing)'); }
		if(this.phone_number.value != '' &&
			 numeric_phone.length < 10) { r = false; this.showError(this.phone_number_label, '(invalid)'); }
		
		return r;
	},

	showError: function(el, txt){
		new Element('span', {'class': 'error'}).setHTML(txt).injectAfter(el);
	},

	hide: function(){
		this.cookie.set('links', []);
		this.setCookie(this.config.cookie_name, this.cookie);
		this.setCookie(this.config.cookie_name + '_shown', true, { duration: this.options.cookieExpire });
		this.active = false;
		this.container.remove();
		this.background.remove();

		// Store hide in DB
		if(!this.storeHide) return;
		new Ajax(this.options.baseURL+'/'+this.options.scriptName+'.php', {
			method: 'post',
			data: 'response=hide&msg_id='+this.msg_id
		}).request();
		this.storeHide = false;
	},
        hide_slide: function(){
            this.cookie.set('links', []);
	    this.setCookie(this.config.cookie_name, this.cookie);
	    this.setCookie(this.config.cookie_name + '_shown', true, { duration: this.options.cookieExpire });
            
                this.fx.start(0,-this.content.height).chain(function(){
                    this.active = false;
                    this.content.remove();
                }.bind(this));
            
           
        },

	setCookie: function(name, value, options){
		options = options || {};
		if (!options.path) options.path = '/';
		switch($type(value)){
			case 'object': value = Json.toString(value.obj); break;
		}
		Cookie.remove(name);
		if (value.length == 0) return;
		if (value.length > 4096) return; //cookie would be truncated!
		Cookie.set(name, value, options);
	}
});

Click2Call.implement(new Options, new Events);