/* Copyright 2006 Vantageous, LLC. All rights reserved. */

var krocos = {};

krocos.globals = {};
krocos.globals.head = getElementsByTagAndClassName('head')[0]; 
krocos.globals.cookieProps = {expires: 7, path: '/'};

/* load safari css */
if (navigator.userAgent.toLowerCase().indexOf('safari') != -1) {
    var script = createDOM('link', {
        'rel': 'stylesheet',
        'href': '/css/safari.css',
        'type': 'text/css'
    });
    appendChildNodes(krocos.globals.head, script);
}

/* keep google/urchin from slowing page loads */

connect(window, 'onload', function() {
    setTimeout(function() {
        var script = createDOM('script', {
            'charset': 'utf-8',
            'src': 'https://ssl.google-analytics.com/urchin.js',
            'type': 'text/javascript'
        });
        appendChildNodes(krocos.globals.head, script);

        var interval = setInterval(function() {
            if ('urchinTracker' in window) {
                _uacct = 'UA-89767-9';
                urchinTracker(); // will throw if doesn't exist
                clearInterval(interval);
            }
        }, 500);
    }, 1);
});


krocos.formHandling = {
    
    addHighlight: function(e) {
        var elem = e.src().parentNode.parentNode; //should be container class
        addElementClass(elem, 'highlight');
    },
    
    removeAllHighlight: function(e) {
        forEach(krocos.formHandling.elems, function(elem) {
            removeElementClass(elem.parentNode.parentNode, 'highlight');        
        });
    },
    
    clearDefaultText: function(e) {
        var elem = e.src();
        if (getNodeAttribute(elem, 'defaulttext') == elem.value) {
            elem.value = '';
        }
    },
    
    toggleEnabled: function(e) {
        var src = e.src();
        var elem = getElementsByTagAndClassName('input', 'input_text', e.src().parentNode.parentNode)[0];
        if (src.checked === true) {
            elem.readOnly = true;
            addElementClass(elem, 'grayed_out');
            if (getNodeAttribute(elem, 'readonlytext') !== null) {
                elem.value = getNodeAttribute(elem, 'readonlytext');
            } else {
                elem.value = src.parentNode.getElementsByTagName('label')[0].innerHTML;
            }
        } else {
            elem.readOnly = false;
            removeElementClass(elem, 'grayed_out');
            elem.value = '';
        }
    }, 
    
    showBillingForm: function(e) {
        krocos.util.makeInvisible('billing_info_read_only');
        krocos.util.makeVisible('billing_info_read_write');
    },
    
    locationCheck: function(e) {
        elem = getElement('location_response');
        
        var query = strip(e.src().value);
        var d = doSimpleXMLHttpRequest('/services/rest/location/' + query + '/');
            
        d.addCallback(function(r) {
            var input_field = getElement('location').value = r.responseText;
        });
    },
    
    init: function() {
        krocos.formHandling.elems = getElementsByTagAndClassName('input', 'input_text');
        var textareas = getElementsByTagAndClassName('textarea', null);
        forEach(textareas, function(textarea) {
            krocos.formHandling.elems.push(textarea);
        });

        forEach(krocos.formHandling.elems, function(elem) {
            connect(elem, 'onfocus', krocos.formHandling.addHighlight);
            if (elem.value !== '' && getNodeAttribute(elem, 'defaulttext') !== '') {
                connect(elem, 'onfocus', krocos.formHandling.clearDefaultText);
            }
            connect(elem, 'onblur', krocos.formHandling.removeAllHighlight);
        });

        try {
            connect('search_email', 'onfocus', krocos.formHandling.clearDefaultText); 
        } catch(e) { /* pass */ }

        var checkboxes = getElementsByTagAndClassName('input', 'input_check');
        forEach(checkboxes, function(checkbox) {
            connect(checkbox, 'onchange', krocos.formHandling.toggleEnabled);
            connect(checkbox, 'onclick', krocos.formHandling.toggleEnabled); //connect this as well for IE
        });

        try {
            connect('billing_info_edit_link', 'onclick', krocos.formHandling.showBillingForm);
        } catch(e) { /* pass */ }

        try {
            connect('location', 'onblur', krocos.formHandling.locationCheck);
        } catch(e) { /* pass */ }
    }  
};

krocos.search = {
    lastQuery: '',
    page: 1,

    inputFocus: function() {
        var self = krocos.search;
        if (self.SEARCH_INPUT.value === self.DEFAULT) {
            self.SEARCH_INPUT.value = '';
        }
    },
    
    inputBlur: function() {
        var self = krocos.search;
        if (self.SEARCH_INPUT.value === '') {
            self.SEARCH_INPUT.value = self.DEFAULT;
        }
    },
    
    updateSearchEmailLink: function(e) {
        var elem = getElement('email_form_note');
        var query = strip(getElement('krocos_search').value);
        
        krocos.util.makeInvisible('email_form_confirm');
        
        if (query.length >= 3) {
            elem.innerHTML = '<a id="search_email_text" href="/email/subscribe/' + query + '/">Recibe en tu email las &uacute;ltimas ofertas relacionadas con “' + query + '” </a>';
        } else {
            elem.innerHTML = 'ej. “Administrativa en Castell&oacute;n” o “Consultor inform&aacute;tico en Valencia”';
        }
    },

    repage: function(url) {
        var self = krocos.search;
        var arr = url.split('/');
        self.page = arr[arr.length - 2];
        window.location.hash = 'sizer';
        self.refresh();
    },
    
    updateSearchResults: function() {
        var self = krocos.search;
        var src = getElement('krocos_search');

        var query = strip(src.value);
        
        if (query == self.lastQuery) {
            return;
        } else {
            self.lastQuery = query;
        }
        
        krocos.util.makeInvisible('email_form_container');
        krocos.util.makeVisible('email_form_note');
        
        self.page = 1;
        self.refresh();
    },
    
    refresh: function() {
        var self = krocos.search;
        var elem = getElement('content');

        addElementClass('krocos_search_form', 'searching');

        krocos.cookie('krocos_query', self.lastQuery, krocos.globals.cookieProps);
        krocos.cookie('krocos_page', self.page, krocos.globals.cookieProps);
        
        var d = doSimpleXMLHttpRequest(
            '/services/rest/search/' + self.lastQuery + '/' + self.page + '/');
        
        d.addCallback(function(text) {
            elem.innerHTML = '';
            elem.innerHTML = text.responseText;
            removeElementClass('krocos_search_form', 'searching');
            d = null;
        });
    },
    
    init: function() {
        if (krocos.cookie('krocos_query') !== null && krocos.cookie('krocos_page') !== null) {
            getElement('krocos_search').value = krocos.cookie('krocos_query');
            krocos.search.lastQuery = krocos.cookie('krocos_query');
            krocos.search.updateSearchEmailLink();
            krocos.search.page = krocos.cookie('krocos_page');
            krocos.search.refresh();
            if (krocos.search.lastQuery === '') {
                getElement('krocos_search').value = getNodeAttribute('krocos_search', 'defaulttext');
            }
        }

        connect('krocos_search_form', 'onsubmit', function(e) { e.stop(); });
        connect('krocos_search', 'onkeyup', krocos.search.updateSearchEmailLink);
        connect('krocos_search', 'onkeyup', krocos.search.updateSearchResults);

        connect('email_subscribe_form', 'onsubmit', function(e) {
            e.stop();
            MochiKit.Async.doSimplePostXMLHttpRequest('/services/rest/email/subscribe/', {
                'search_email': getElement('search_email').value,
                'query': getElement('krocos_search').value
            });
            krocos.util.makeInvisible('email_form_container'); 
            krocos.util.makeVisible('email_form_confirm');
        });

        connect('email_subscribe_form', 'onclick', function(e) {
            e.stop();
            var id = e.target().id;
            if (id == 'search_email_text') {
                krocos.util.makeVisible('email_form_container'); 
                krocos.util.makeInvisible('email_form_note');
            } else if (id == 'email_subscribe_submit') {
                MochiKit.Async.doSimplePostXMLHttpRequest('search/subscribe.php', {
                    'search_email': getElement('search_email').value,
                    'query': getElement('krocos_search').value
                });
                krocos.util.makeInvisible('email_form_container'); 
                krocos.util.makeVisible('email_form_confirm');
            }
        });

        var preload = new Image(600, 100).src = '/css/search_input_text_candy.gif';
    }
    
};

krocos.jobs = {};
krocos.jobs.textarea = {

    jobForm: {},
    characterMax: 0,
    
    init: function() {
        var self = krocos.jobs.textarea;
        
        /* self.characterMax = scrapeText('charactersRemaining');
        self.updateCount();        
        connect('job_description', 'onkeyup', self.updateCount); */
        
        cache = new Image();
        cache.src = "/css/html_editor/bold_down.gif";
        connect('bold', 'onmousedown', function(e) {
            e.stop();
            elem = getElement('bold');
            elem.src = elem.src.replace(/up/, 'down');
        });        
        connect('bold', 'onmouseup', function(e) {
            e.stop();
            elem = getElement('bold');
            elem.src = elem.src.replace(/down/, 'up');
        });        

        connect('bold', 'onclick', function(e) {
            e.stop();
            self.insertTags('**', '**', 'bold');
            /*self.updateCount();*/
        });
        
        
        connect('list', 'onmousedown', function(e) {
            e.stop();
            elem = getElement('list');
            elem.src = elem.src.replace(/up/, 'down');
        });
        connect('list', 'onmouseup', function(e) {
            e.stop();
            elem = getElement('list');
            elem.src = elem.src.replace(/down/, 'up');
        });
        connect('list', 'onclick', function(e) {
            e.stop();
            self.insertTags('\n* ', '', 'list item');
            /*self.updateCount();*/
        });
    },
    
    updateCount: function() {
        var self = krocos.jobs.textarea;
        var text = getElement('job_description').value
        text = text.replace(/\s/gmi, '');
        var count = text.length;
        replaceChildNodes('charactersRemaining', self.characterMax - count);
        if (count > self.characterMax) {
            addElementClass('charactersRemaining', 'warning');
        } else if (count <= self.characterMax) {
            removeElementClass('charactersRemaining', 'warning');
        }
    },
    
    insertTags: function(openTag, closeTag, sampleText) {
        var area = getElement('job_description');
        var ds = document.selection;

        if (ds) {
            var theSelection = ds.createRange().text;
            
            if (!theSelection) {
                theSelection = sampleText;
            }
            
            area.focus();
            
            if (theSelection.charAt(theSelection.length - 1) == ' ') {
                theSelection = theSelection.substring(0, 
                    theSelection.length - 1);
                ds.createRange().text = openTag + theSelection + 
                    closeTag + ' ';
            } else {
                ds.createRange().text = openTag + theSelection + closeTag;
            }
            
        } else if (typeof(area.selectionStart) == 'number') {

            var replaced = false;
            var startPos = area.selectionStart;
            var endPos = area.selectionEnd;
            var scrollTop = area.scrollTop;
            var text = (area.value).substring(startPos, endPos);

            if (endPos - startPos) {
                replaced = true;
            }
            
            if (!text) {
                text = sampleText;
            }
            
            if (text.charAt(text.length - 1) == ' ') {
                replaceWith = openTag + text.substring(0, (text.length - 1)) + 
                    closeTag + ' ';
            } else {
                replaceWith = openTag + text + closeTag;
            }
            
            area.value = area.value.substring(0, startPos) + replaceWith +
                area.value.substring(endPos, area.value.length);
            
            area.focus();

            if (replaced) {
                var cPos = startPos + (openTag.length + text.length + 
                    closeTag.length);
                area.selectionStart = cPos;
                area.selectionEnd = cPos;
            } else {
                area.selectionStart = startPos + openTag.length;
                area.selectionEnd = startPos + openTag.length + text.length;
            }
            area.scrollTop = scrollTop;
        }
        
        if (area.createTextRange) {
            area.caretPos = ds.createRange().duplicate();
        }
    }
    
};

krocos.accounts = {};
krocos.accounts.billing = {
    
    init: function() {
        var self = krocos.account.card.billing;
        connect('cardNumber', 'onkeyup', self.updateCardInfo);
    },
    
    updateCardInfo: function() {
        var number = getElement('cardNumber').value;
        var type = krocos.card.getType(number);
        
        if (type === null) {
            replaceChildNodes('cardType', 'Invalid');
        } else {
            replaceChildNodes('cardType', type.name);
        }
        
        if (krocos.card.isValid(number)) {
            replaceChildNodes('isValid', 'Yes');
        } else {
            replaceChildNodes('isValid', 'No');
        }
    }

};

/* From: dojo.cookie
   Copyright (c) 2005-2007, The Dojo Foundation
   All rights reserved.
   License: "New" BSD. */
   
krocos.cookie = function(/*String*/name, /*String?*/value, /*Object?*/props){
   	var c = document.cookie;
   	if (arguments.length == 1) {

   		var idx = c.lastIndexOf(name + '=');
   		if (idx == -1) { return null; }
   		var start = idx + name.length + 1;
   		var end = c.indexOf(';', idx + name.length + 1);
   		if (end == -1) { end = c.length; }
   		return decodeURIComponent(c.substring(start, end)); 

   	} else {

   		props = props || {};
   		value = encodeURIComponent(value);
   		
   		if (typeof(props.expires) == "number") {
   			var d = new Date();
   			d.setTime(d.getTime() + (props.expires * 24 * 60 * 60 * 1000));
   			props.expires = d;
   		}

   		document.cookie = name + '=' + value 
   			+ (props.expires ? '; expires=' + props.expires.toUTCString() : '')
   			+ (props.path ? '; path=' + props.path : '')
   			+ (props.domain ? '; domain=' + props.domain : '')
   			+ (props.secure ? '; secure' : '');

   		return null;
   	}
};

krocos.util = {
    toggleVisible: function(elem) {
        if (getElement(elem) !== null) {
            toggleElementClass('invisible', elem);
        }
    },
    makeVisible: function(elem) {
        if (getElement(elem) !== null) {
            removeElementClass(elem, 'invisible');
        }
    },
    makeInvisible: function(elem) {
        if (getElement(elem) !== null) {
            addElementClass(elem, 'invisible');
        }
    },
    isVisible: function(elem) {
        if (getElement(elem) !== null) {
            return !hasElementClass(elem, 'invisible');
        }
        return false;
    },
    write_email: function(cipher, key) {
        var clear = '';
        var shift = cipher.length;
        for (var i=0; i<cipher.length; i++) {
            var idx = key.indexOf(cipher.charAt(i));
            if (idx == -1) { 
            clear += (cipher.charAt(i));
            } else {
                clear += key.charAt((idx - shift + key.length) % key.length);
            }
        }
        document.write('<a href="mailto:'+clear+'">'+clear+'</a>');
    }
};

krocos.util.creditCard = {
    types: [
        {'name': 'amex', 'len': [15], 'prefix': new RegExp('^3[4|7]')},
        {'name': 'discover', 'len': [16], 'prefix': new RegExp('^6011')},
        {'name': 'mastercard', 'len': [16], 'prefix': new RegExp('^5[1-5]')},
        {'name': 'visa', 'len': [16,13], 'prefix': new RegExp('^4')}
    ],
    
    getType: function(number) {
        /* see: http://www.beachnet.com/~hstiles/cardtype.html */
        number = '' + number;
        number = number.replace(new RegExp('[^\\d]', 'gi'), '');
        
        var self = krocos.util.creditCard;
        for (var i = 0; i < self.types.length; i++) {
            if (number.match(self.types[i].prefix)) {
                return self.types[i];
            }
        }
        return null;
    },
    
    isValid: function(number) {
        var self = krocos.card;
                
        var type = self.getType(number);
        if (type === null) {
            return false;
        }
        
        number = '' + number;
        number = number.replace(new RegExp('[^\\d]', 'gi'), '');
        
        var lenOK = false;
        for (var i = 0; i < type.len.length; i++) {
            if (type.len[i] == number.length) {
                lenOK = true;
                break;
            }
        }
        
        if (lenOK === false) {
            return false;
        }
        
        return self.checkLuhn(number);
    },
    
    checkLuhn: function(number) {
        /* see: http://en.wikipedia.org/wiki/Luhn */
        number = '' + number;
        number = number.replace(new RegExp('[^\\d]', 'gi'), '');

        var sum = 0;
        var parity = number.length % 2;
        var digit = 0;

        for (var i = 0; i < number.length; i++) {
            digit = parseInt(number.charAt(i));
            if (i % 2 == parity) {
                digit = digit * 2;
            }
            if (digit > 9) {
                digit = digit - 9;
            }
            sum = sum + digit;
        }

        return (sum % 10) === 0;
    }
    
};

/* TODO: something like doSimplePostXMLHttpRequest will be in MochiKit soon.
Replace this with that function when it's there. */

/* from: http://groups.google.com/group/mochikit/msg/e3bd7456ee21bef7 */
MochiKit.Async.doSimplePostXMLHttpRequest = function (url/*, ...*/) {
    var self = MochiKit.Async;
    var req = self.getXMLHttpRequest();
    if (arguments.length > 1) {
        var m = MochiKit.Base;
        var qs = m.queryString.apply(null, m.extend(null, arguments, 1));
    }
    req.open("POST", url, true);
    /* taken from prototype, pretty much verbatim */
    var requestHeaders =
        ['X-Requested-With', 'XMLHttpRequest',
        'X-MochiKit-Version', MochiKit.Async.VERSION,
        'Accept', 'text/javascript, text/html, application/xml, text/xml, */*',
        'Content-type', 'application/x-www-form-urlencoded'];

        /* Force "Connection: close" for Mozilla browsers to work around a bug
        where XMLHttpReqeuest sends an incorrect Content-length header. See
        Mozilla Bugzilla #246651. */
        
    if (req.overrideMimeType) {
        requestHeaders.push('Connection', 'close');
    }
    for (var i = 0; i < requestHeaders.length; i += 2) {
        req.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
    }
    return self.sendXMLHttpRequest(req, qs);
};