function requireJS(libraryName) {
    // inserting via DOM fails in Safari 2.0, so brute force approach
    document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
}


function closeNote(id)
{
    $('note_'+id).hide();
    var url = '/_ajax/notes/dismiss.php';
    new Ajax.Request(url, 
        {
            method: 'get',
            parameters: 'id='+id
        }
    );
}

function updateLicenses(note_id)
{
    closeNote(note_id);
    var url = '/_ajax/notes/update_licenses.php';
    new Ajax.Request(url, 
        {
            method: 'get',
            onSuccess: function(data)
            {
                if(data.responseText == 'OK')
                {
                    messageBox('Your models have been updated. Thank you!');
                }
                else
                {
                    messageBox('There was an error while updating your models.');
                }
            }
        }
    );
}

function messageBox(message)
{
    $('message').update(message + '<br/><br/>');
    $('message').show();
    $('message').scrollTo();
}

function timedMessageBox(message, duration)
{
    messageBox(message);
    setTimeout(closeMessageBox, duration ? duration : 10000);
}

function closeMessageBox()
{
    $('message').fade();
}

function popUp(URL,winname) {
    day = new Date();
    winname = winname ? winname : day.getTime();
    eval("page" + winname + " = window.open(URL, '" + winname + "', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=0,width=520,height=500');");
    eval("page" + winname + ".focus();");
}

function emailCheck (emailStr) {
    var emailPat=/^(.+)@(.+)$/
    var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
    var validChars="\[^\\s" + specialChars + "\]"
    var quotedUser="(\"[^\"]*\")"
    var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/
    var atom=validChars + '+'
    var word="(" + atom + "|" + quotedUser + ")"
    var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
    var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")
    var matchArray=emailStr.match(emailPat)
    if (matchArray==null) {
        //return("Email address seems incorrect (check @ and .'s)")
        return 1
    }
    var user=matchArray[1]
    var domain=matchArray[2]
    if (user.match(userPat)==null) {
        //return("The username doesn't seem to be valid.")
        return 2
    }
    var IPArray=domain.match(ipDomainPat)
    if (IPArray!=null) {
          for (var i=1;i<=4;i++) {
            if (IPArray[i]>255) {
                //return("Destination IP address is invalid!")
                return 3
            }
        }
        return false
    }
    var domainArray=domain.match(domainPat)
    if (domainArray==null) {
        //return("The domain name doesn't seem to be valid.")
        return 4
    }
    var atomPat=new RegExp(atom,"g")
    var domArr=domain.match(atomPat)
    var len=domArr.length
    if (domArr[domArr.length-1].length<2 ||
       domArr[domArr.length-1].length>3) {
       //return("The address must end in a three-letter domain, or two letter country.")
       return 5
    }
    if (len<2) {
       //var errStr="This address is missing a hostname!"
       var errStr = 6
       return(errStr)
    }
    return false;
}

function mailto(user,domain) {
    status="mailto:" + user + "@" + domain;
    locationstring = "mailto:" + user + "@" + domain;
    window.location = locationstring;
}

function rollNav(imgid,status) {
    document.images[imgid].src = '/0-icons/'+imgid+'_'+status+'.gif';
}

function getRadioValue(formElt) {
    if(formElt.length=='undefined'){
        return formElt.checked; /* only one button */
    }
    for (var i=0; i<formElt.length; i++) {
        if (formElt[i].checked) return formElt[i].value;
    }
    return false;
}

function selectRadioOption(item,form) {
    checkRadio = false;
    itemName = item.name;
    for (var i=0; i<form.length; i++) {
        if (form[i].name == itemName) if (form[i].checked) checkRadio = true;
    }
    if (checkRadio) {
        for (var i=0; i<form['private'].length; i++) {
            if (form['private'][i].value == '-1') form['private'][i].checked = true;
        }
    }
}

function checkRestricted(item, form) {
    if (item.checked) {
        for (var i=0; i<form.length; i++) {
            if (form[i].name == 'restricted') if (form[i].checked) form[i].checked = false;
        }
    }
}

function show_div(id)
{
    //try and catch to avoid javascript error
    try{
        document.getElementById(id).style.display = "inline";
    }
    catch(e){

    }
}

function hide_div(id)
{
    //try and catch to avoid javascript error
    try{
        if(document.getElementById(id))
            document.getElementById(id).style.display = "none";
    }
    catch(e){

    }
}

function trim(s) {
    return s.replace(/^\s+/, '').replace(/\s+$/, '');
}

function ltrim(s) {
    return s.replace(/^\s+/, '');
}

function rtrim(s) {
    return s.replace(/\s+$/, '');
}

// addLoadEvent to enhance the window.onload event

function addLoadEvent(func) {
           var oldonload = window.onload;
           if (typeof window.onload != "function") {
              window.onload = func;
           } else {
              window.onload = function() {
                 if (oldonload) {
                    oldonload();
                 }
                 func();
              };
           }
        }

var Switcher = {
    go: function(switcherId, panelId, callbackOpen, callbackClose) {
        $(switcherId).show();
        $(switcherId).childElements().invoke('removeClassName', 'on');

        // Show the selected panel
        if(typeof(callbackOpen) == 'undefined')
        {
            $(panelId).show();
        }
        else
        {
            callbackOpen(panelId);
        }
        $(panelId).addClassName('on');

        // Loop though and close all other panels
        $(switcherId).childElements().reject(function(s){return s.hasClassName('on');}).each(function(panel) {
            if(typeof(callbackClose) == 'undefined')
            {
                panel.hide();
            }
            else
            {
                callbackClose(panel.readAttribute('id'));
            }
        });

        return false;
    }
}

var FormBuilder = {
  post: function(element) {
    var f = document.createElement('form'); 
    f.style.display='none'; 
    $(element).parentNode.appendChild(f); 
    f.method='POST'; 
    f.action=$(element).href; 
    f.submit();
    return false;
  }
}

// ===========================================
// = Used for select boxes that submit a URL =
// ===========================================
var DropSelector = {

  start: function() {
    if (!this.blurObserver) {
      this.changeObserver = this.onChangeSelection.bind(this);
      $$('select.drop_selector').each(function(element) {
        Event.observe(element, "change", DropSelector.onChangeSelection);
      });
    }
  },

  onChangeSelection: function(event) {
    var element = Element.extend(Event.element(event));
    if(element.value)
      window.location = element.value;
  }
}

// =================================================
// = Generic toggle link, used for confirm sliders =
// =================================================
var Toggler = {
  
  // Toggles visibility of an element and changes the text of the toggle link
  // First closes any open confirm divs
  toggleElement: function(element, close_confirms, after) {
    
    // Make sure there that only one confirm animation can run at a time
    if(Effect.Queues.get('confirm').size() > 0) return false;
    
    if(!(element = $(element))) return;
    
    // First close all open confirm divs, unless asked not to
    if(close_confirms == null || close_confirms == true) {
      $$('.closeable').each(function(e) {
        // Make sure we don't attempt to close the selected elemtent
        if(e.id != element.id) Toggler.closeElement(e);
      });
    }
    
    // Now toggle the chosen div
    var link_id = element.id + "_toggle_link";
    new Effect.toggle(element,'blind',{
      queue: {position: 'end', scope: 'confirm'},
      afterFinish: function(obj) {
        var link_element = $(link_id);
        if (link_element != null) {
          var tmp_string = link_element.innerHTML;
          link_element.update($(link_id).readAttribute('alternate_text'));
          link_element.setAttribute('alternate_text', tmp_string);
        }
        if(after != null)
        after();
      }
    });
    return false;
  },
  
  // Close the element if it is open
  closeElement: function(element) {
    if(!(element = $(element))) return;
    if(element.style.display != 'none') {
      Toggler.toggleElement(element, false);
    }
  }
}

var Minimizer = {
    toggleElement: function(content, minimizer) {
        Toggler.toggleElement(content, true, function() {
            if($(content).style.display != 'none') {
                $(minimizer).descendants().first().src = '/0-icons/arrow-down-grey.png';
            } else {
                $(minimizer).descendants().first().src = '/0-icons/arrow-left-grey.png';
            }
        });
        return false;
    }

}

var SubMenu = {
    create: function(li) {
        if(!$(li)) return;
        this.item = $(li);
        this.id = this.item.getAttribute('id');
        this.trigger = this.item.down('.drop-down-trigger');
        if(!this.trigger) return;
        this.box = this.item.down('.drop-down-box');
        this.trigger.observe('click', SubMenu.click.bind(this));
        document.observe('click', SubMenu.close.bind(this));
    },
    click: function(event) {
        event.stop();
        document['drop-down'].findAll(function(s){return s.id != this.id;}, this).each(function(s){SubMenu.hide.bind(s)()});
        if(this.box.visible())
        {
            SubMenu.hide.bind(this)();
        }
        else
        {
            SubMenu.show.bind(this)();
        }
    },
    show: function() {
        this.box.show();
        this.trigger.addClassName('selected');
        this.box.addClassName('selected');
        if(!this.box.readAttribute('oldLeft')) this.box.writeAttribute('oldLeft' , this.trigger.cumulativeOffset().left+'px');
        this.box.setStyle({left: this.box.readAttribute('oldLeft')});
        var o = this.box.cumulativeOffset().left;
        var extra = o + this.box.getWidth() - $('main').getWidth();
        if(extra > 0)
        {
            this.box.setStyle({left: (o - this.box.getWidth() + this.trigger.getWidth()) + 'px'}); //shift left
        }
    },
    close: function(event) {
        var t = event.target != null ? event.target : event.srcElement;
        if($(t).descendantOf($(this.box)) || Element.hasPosition(this.box, Event.pointerX(event), Event.pointerY(event))) return;
        SubMenu.hide.bind(this)();
    },
    hide: function(id) {
        if(typeof(id) != 'undefined')
        {
            dd = document['drop-down'].detect(function(s){return s.id == id;});
        }
        else
        {
            dd = this;
        }
        dd.box.hide();
        dd.trigger.removeClassName('selected');
        dd.box.removeClassName('selected');
    },
    init: function() {
        Element.addMethods({
            hasPosition : function(element, x, y){
                element = $(element);
                this.topleft = Element.cumulativeOffset(element);
                this.bottomright = [
                    this.topleft[0] + element.offsetWidth,
                    this.topleft[1] + element.offsetHeight,
                ];
                return (y >= this.topleft[1] &&
                    y <  this.bottomright[1] &&
                    x >= this.topleft[0] &&
                    x <  this.bottomright[0]);
            }
        });
        document['drop-down'] = $A([]);
        $$('.drop-down').each(function(s, i){document['drop-down'][i] = new SubMenu.create(s);});
    }
    
}

var CustomScrollBar = {
    slider: [],
    create: function(element, options)
    {
        $(element).show = function(){
            $(this).style.display = 'block';
            setTimeout(function(){CustomScrollBar.refresh(element)},1);
        };
        $(element).style.overflow = "hidden";
        $(element).style.position = "relative";
        if(options.axis == 'vertical')
        {
            CustomScrollBar.slider[element] = {options: options};
            if ($(element).scrollHeight > $(element).offsetHeight) {
                $(element).style.paddingRight = "15px";
                if($(element + '_scrollY')) $(element + '_scrollY').remove();
                $(element).insert({after: '<div id="' + element + '_scrollY" class="scrollbar_scrollY" _element="' + element + '" style="height:' + $(element).getHeight() + 'px;position:absolute;left:' + ($(element).cumulativeOffset()[0] + $(element).getWidth() - 10) + 'px;top:' + $(element).cumulativeOffset()[1] + 'px"><div class="scrollbar_up"></div><div id="' + element + '_track" class="scrollbar_track" style="height:' + ($(element).getHeight() - 30) + 'px;"><div id="' + element + '_handle" class="scrollbar_handle" style="height:' + Math.round(($(element).offsetHeight - 30) / $(element).scrollHeight * ($(element).offsetHeight - 30)) + 'px"></div></div><div class="scrollbar_down"></div></div>'});
                CustomScrollBar.slider[element].slider = new Control.Slider(element + '_handle', element + '_track', {
                    axis: 'vertical',
                    onSlide: function(v){ 
                        CustomScrollBar.scrollVertical(v, $(element), CustomScrollBar.slider[element].slider);  
                    },
                    onChange: function(v){ 
                        CustomScrollBar.scrollVertical(v, $(element), CustomScrollBar.slider[element].slider); 
                    }
                });
                if(options.fade)
                {
                    if(options.fade == 'bottom')
                    {
                        $(element).insert({after: '<div id="' + element + '_fadeBottom" class="scrollbar_fadeBottom" style="width:' + ($(element).getWidth() - 10) + 'px;left:' + $(element).cumulativeOffset()[0] + 'px;top:' + ($(element).cumulativeOffset()[1] + $(element).getHeight() - 20) + 'px;"></div>'});
                    }
                }
                $$('.scrollbar_up').invoke('observe', 'mousedown', CustomScrollBar.scrollBackStart);
                $$('.scrollbar_up').invoke('observe', 'mouseup', CustomScrollBar.scrollStop);
                $$('.scrollbar_down').invoke('observe', 'mousedown', CustomScrollBar.scrollForwardStart);
                $$('.scrollbar_down').invoke('observe', 'mouseup', CustomScrollBar.scrollStop);
            }
            else
            {
                if($(element + '_scrollY')) 
                {
                    $(element + '_scrollY').remove();
                    $(element).style.paddingRight = "0px";
                }
            }
        }
        else if(options.axis == 'horizontal')
        {
            //TODO
        }
    },
    refresh: function(element) {
        if($(element).visible())
        {
            CustomScrollBar.create(element, CustomScrollBar.slider[element].options);
        }
    },
    hide: function(element) {
        if($(element + '_scrollY')) $(element + '_scrollY').hide();
        if($(element + '_fadeBottom')) $(element + '_fadeBottom').hide();
    },
    show: function(element) {
        if(CustomScrollBar.slider[element].slider)
        {
            CustomScrollBar.slider[element].slider.setValue(0);
        }
        if($(element + '_scrollY')) $(element + '_scrollY').show();
        if($(element + '_fadeBottom')) $(element + '_fadeBottom').show();
    },
    scrollVertical: function(value, element, slider) {
        element.scrollTop = Math.round(value/slider.maximum*(element.scrollHeight-element.offsetHeight));
    },
    scrollHorizontal: function(value, element, slider) {
        element.scrollLeft = Math.round(value/slider.maximum*(element.scrollWidth-element.offsetWidth));
    },
    scrollBackStart: function() {
        var element = $(this).up('.scrollbar_scrollY').readAttribute('_element');
        CustomScrollBar.slider[element].mousedown = true;
        CustomScrollBar.scrollBackOnce(element);
        setTimeout(function(){
        if(CustomScrollBar.isMouseDown(element)){
            CustomScrollBar.slider[element].timer = setInterval(function(){if(CustomScrollBar.isMouseDown(element)) CustomScrollBar.scrollBackOnce(element)}, 45);
        }
        }, 250);
    },
    scrollBackOnce: function(element) {
        CustomScrollBar.slider[element].slider.setValue(CustomScrollBar.slider[element].slider.value - 0.05);
        if(CustomScrollBar.slider[element].slider.value == 0 || CustomScrollBar.slider[element].slider.value == 1)
        {
            CustomScrollBar.scrollStop.bind($(element + '_track'))();
        }
    },
    scrollForwardStart: function() {
        var element = $(this).up('.scrollbar_scrollY').readAttribute('_element');
        CustomScrollBar.slider[element].mousedown = true;
        CustomScrollBar.scrollForwardOnce(element);
        setTimeout(function(){
        if(CustomScrollBar.isMouseDown(element)){
            CustomScrollBar.slider[element].timer = setInterval(function(){if(CustomScrollBar.isMouseDown(element)) CustomScrollBar.scrollForwardOnce(element);}, 45);
        }
        }, 250);
    },
    scrollForwardOnce: function(element) {
        CustomScrollBar.slider[element].slider.setValue(CustomScrollBar.slider[element].slider.value + 0.05);
        if(CustomScrollBar.slider[element].slider.value == 0 || CustomScrollBar.slider[element].slider.value == 1)
        {
            CustomScrollBar.scrollStop.bind($(element + '_track'))();
        }
    },
    scrollStop: function() {
        var element = $(this).up('.scrollbar_scrollY').readAttribute('_element');
        CustomScrollBar.slider[element].mousedown = false;
        clearInterval(CustomScrollBar.slider[element].timer);
    },
    isMouseDown: function(element) {
        return CustomScrollBar.slider[element].mousedown;
    }
}

function runOrInstallShape(pars){
    if(isShapeInstalled) {
        document.getElementById('shape-spinner').style.display = '';
        setTimeout(function(){
           document.getElementById('shape-spinner').style.display = 'none';
        }, 60000);
        return getPassString(pars);
    } else {
        window.location = "/software/3dvia-shape/";
    }
}

var isShapeInstalled = true;
var IEDetect = false;

if (navigator.mimeTypes && navigator.mimeTypes.length)
{
  x = navigator.mimeTypes['application/x-3dviashapeplugin'];
  if ((!x) || (!x.enabledPlugin))
  {
    isShapeInstalled = false;
  }
}
else
{
  IEDetect = true;
}

function getPassString(pars){

    new Ajax.Request(
        '/_ajax/shape/launch.php',
        { 
            method:'post', 
            parameters: {pars: pars},
            onSuccess: function(t){window.location = t.responseText;},
            onFailure: function(){alert('Shape failed to load!');}
        }
);

    return false;
}

function insertPlayer(model, id, width, height)
{
    document.write("<object type='application/x-3dxmlplugin' data='" + model + "' id='" + id + "' width='" + width + "' height='" + height + "' style='MARGIN: 0px' border='0'><param name='DocumentFile' value='" + model + "'>");
    document.write("<div style='margin:" + height/3 + "px 0 0 0' class='noticeContainer'><div class='noticeSubContainer'><div class='left icon'><img border='0' src='/0-icons/ico_information.png' width='24' height='24' alt='notice' /></div><div class='left notice'><span class='noticeTitle'>The 3D XML player doesn't seem to be installed. <a href='http://www.3ds.com/products/3dvia/3d-xml/1/' class='blue' title='Download 3D XML Player' target='_blank'>Download the player here.</a></span></div><br clear='all'/></div></div>");
    document.write("</object>");
}


/* ADMIN JS TOOLS */

<!--

  function admin_confirmDeleteCache() {
      if (confirm('Are you sure you want to delete the entire cache?')) {
          location = '/admin/admin_cache_delete.php';
          return false;
      }
  }

  function admin_confirmDeleteCacheGroup(group) {
      if (confirm('Are you sure you want to delete all the cache files in this directory?')) {
          location = '/admin/admin_cache_delete.php?group='+group;
          return false;
      }
  }

  function admin_confirmDeleteCacheFile(group, file) {
      if (confirm('Are you sure you want to delete this cache file?')) {
          location = '/admin/admin_cache_delete.php?group='+group+'&file='+file;
          return false;
      }
  }

    function admin_confirmDeleteMedia(media_id, user_id, referer,msg) {
        if (confirm('Warning! You are about to permanently delete this media.\nDo you want to continue?')) {
            location = '/admin/admin_delete.php?type=media&media_id='+media_id+'&user_id='+user_id+'&referer='+referer+'&msg='+msg;
            return false;
        }
    }
    
    function admin_confirmDeleteGallery(gallery_id, user_id, referer) {
        if (confirm('Warning! You are about to permanently delete this gallery.\nDo you want to continue?')) {
            location = '/admin/admin_delete.php?type=gallery&gallery_id='+media_id+'&user_id='+user_id+'&referer='+referer;
        }
    }
    
    function admin_confirmFlagMedia(fieldname, fieldvalue, media_id) {
        if (confirm('You are about to set '+fieldname+'='+fieldvalue+' for this model.\nDo you want to continue?')) {
            location = '/admin/admin_update.php?type=media&fieldname='+fieldname+'&fieldvalue='+fieldvalue+'&media_id='+media_id;
        }
    }

    function admin_confirmFlagGallery(fieldname, fieldvalue, gallery_id) {
        if (confirm('You are about to set '+fieldname+'='+fieldvalue+' for this gallery.\nDo you want to continue?')) {
            location = '/admin/admin_update.php?type=gallery&fieldname='+fieldname+'&fieldvalue='+fieldvalue+'&media_id='+media_id;
        }
    }
    
    function admin_confirmFlagUser(fieldname, fieldvalue, user_id) {
        if (confirm('You are about to set '+fieldname+'='+fieldvalue+' for this user.\nDo you want to continue?')) {
            location = '/admin/admin_update.php?type=user&fieldname='+fieldname+'&fieldvalue='+fieldvalue+'&user_id='+user_id;
        }
    }
    
    function admin_confirmSu(user_id) {
        if (confirm('You are about to use '+user_id+'\'s identity.\nDo you want to continue?')) {
            location = '/admin/admin_su.php?user_id='+user_id;
        }
    }
    
    function admin_confirmFavoriteMedia(action, media_id) {
        var action_array=action.split(":");
        var fieldname=action_array[0];
        var fieldvalue = action_array[1];
        if (confirm('You are about to set '+fieldname+' favorite ='+fieldvalue+' for this model.\nDo you want to continue?')) {
            location = '/admin/admin_update.php?type=favorite&favtype='+fieldname+'&fieldvalue='+fieldvalue+'&media_id='+media_id;
        }
    }
    function admin_confirmFavoriteUser(action, user_id) {
        var action_array=action.split(":");
        var fieldname=action_array[0];
        var fieldvalue = action_array[1];
        if (confirm('You are about to set '+fieldname+' favorite ='+fieldvalue+' for this user.\nDo you want to continue?')) {
            location = '/admin/admin_update.php?type=favorite&favtype='+fieldname+'&fieldvalue='+fieldvalue+'&user_id='+user_id;
        }
    }
    
  function admin_setUserPublisher(user_id, publisher_type, publisher_text) {
    if(confirm('Are you sure you want to set ' + user_id + ' as publisher type ' + publisher_text + '?'))
    {
      location = '/admin/admin_users.php?action=publisher&username=' + user_id + '&publishertype=' + publisher_type;
    }
  }

  function admin_setUserSeller(user_id, val, text) {
    if(confirm('Are you sure you want to ' + (parseInt(val) == 1 ? 'set' : 'unset') + ' ' + user_id + ' as a seller?'))
    {
      location = '/admin/admin_users.php?action=seller&username=' + user_id + '&sellertype=' + val;
    }
  }

//-->

/*  END ADMIN JS TOOLS */
